0 / 0 / 0
Регистрация: 01.11.2011
Сообщений: 42
1

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

07.11.2011, 22:02. Показов 993. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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;}
 Комментарий модератора 
Используйте теги форматирования кода!


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

при рэндомном вводе и таком вводе невсегда получается всё норм, пожалуйста выручайте прога нужна на завтра!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.11.2011, 22:02
Ответы с готовыми решениями:

Помогите найти ошибку в программе! (С++)
Найти строку с минимальной суммой элементов #include&lt;iostream&gt; using namespace std; #include...

Помогите найти ошибку в программе
вводятся фамилия имя отчество, определить самое редкое имя. Что не так, почему программа не...

Помогите найти ошибку в программе
Помогите мне найти ошибку) Реализовать необходимо на С++ #include &lt;iostream&gt; #include &lt;stdlib.h&gt;...

Помогите найти ошибку в программе
Задание: найти по модулю первый и второй максимальний елемент динамичного массива! Код: ...

19
Заблокирован
07.11.2011, 22:15 2
Цитата Сообщение от nemesises Посмотреть сообщение
#include "CMatrix.h"
в студию. оформляйте код тегами
0
0 / 0 / 0
Регистрация: 01.11.2011
Сообщений: 42
07.11.2011, 22:17  [ТС] 3
всмысле?
0
277 / 150 / 25
Регистрация: 05.11.2011
Сообщений: 429
Записей в блоге: 1
07.11.2011, 22:19 4
Неужели в таком виде удобнее читать код?!

Добавлено через 1 минуту
Цитата Сообщение от nemesises Посмотреть сообщение
всмысле?
Содержимое файлика CMatrix.h сюда тоже впишите.
0
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;
}
 Комментарий модератора 
Используйте теги форматирования кода!


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

Не по теме:

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

0
0 / 0 / 0
Регистрация: 01.11.2011
Сообщений: 42
07.11.2011, 22:22  [ТС] 7
уже кинул
вроде тот
0
Заблокирован
07.11.2011, 22:42 8
Цитата Сообщение от nemesises Посмотреть сообщение
при рэндомном вводе и таком вводе невсегда получается всё норм, пожалуйста выручайте прога нужна на завтра!
опишите подробней что и как
0
0 / 0 / 0
Регистрация: 01.11.2011
Сообщений: 42
07.11.2011, 23:17  [ТС] 9
он невсегда удаляет те строки в которых число элементов ненулевых больше нулевых
0
Заблокирован
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 )
0
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++
0
Заблокирован
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, сейчас пришлось прервать выполнение, а то проц поплавится... повод подумать над оптимизацией, или вообще замене алгоритма.
0
0 / 0 / 0
Регистрация: 01.11.2011
Сообщений: 42
08.11.2011, 21:22  [ТС] 13
этот код который вы скинули насколько я понял уже отредактированый?
0
Заблокирован
08.11.2011, 22:40 14
Цитата Сообщение от nemesises Посмотреть сообщение
этот код который вы скинули насколько я понял уже отредактированый?
можно даже смело компилировать. только обратить внимание на то, что файл зовется CMatrix.hpp, и ничто не мешает его оредактировать в CMatrix.h
0
0 / 0 / 0
Регистрация: 01.11.2011
Сообщений: 42
09.11.2011, 21:54  [ТС] 15
но тут нету main
он ведь не сможет запустить
0
Заблокирован
09.11.2011, 22:49 16
Цитата Сообщение от nemesises Посмотреть сообщение
но тут нету main
он ведь не сможет запустить
не мочте голову, вам кто-то написал программу, тут ее довели до ума, а вы даже не удосужитесь открыть книгу и почитать самые азы.
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
09.11.2011, 22:57 17
Цитата Сообщение от nemesises Посмотреть сообщение
но тут нету main
он ведь не сможет запустить
тут нету main?! какой ужас! ведь в каждом .hpp должно быть по main'у
просто используй тот main, который есть, а вместо своего cmatrix.h используй содержание этого :
Цитата Сообщение от alkagolik Посмотреть сообщение
так же подумайте как поменять алгоритм удаления строки, потому что, как видно из теста, в случае если 2 смежные строки подпадают под критерий удаления, то вторая не проверяется. Она перемещается на место первой и таким образом "выскальззывает" от проверки на наличие признаков удаления.
вот готовый голова.
Добавлено через 4 минуты
CMATRIX_HPP
0
Заблокирован
09.11.2011, 23:03 18
Цитата Сообщение от BRcr Посмотреть сообщение
так же подумайте как поменять алгоритм удаления строки, потому что, как видно из теста, в случае если 2 смежные строки подпадают под критерий удаления, то вторая не проверяется. Она перемещается на место первой и таким образом "выскальззывает" от проверки на наличие признаков удаления.
я и это подправил. хедер готовый до конца.
0
0 / 0 / 0
Регистрация: 01.11.2011
Сообщений: 42
09.11.2011, 23:12  [ТС] 19
не, всё равно он не делает что надо

Добавлено через 4 минуты
тю сорри не то открыл, всё заработало, спасибо
0
0 / 0 / 0
Регистрация: 01.11.2011
Сообщений: 42
09.11.2011, 23:14  [ТС] 20
та я с майном завтыкал просто
0
09.11.2011, 23:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.11.2011, 23:14
Помогаю со студенческими работами здесь

Помогите найти ошибку в программе
подскажите почему не работает? #include &lt;stdio.h&gt; #include &lt;conio.h&gt; void FormMassive(int...

Помогите найти ошибку в моей программе
#include&lt;iostream.h&gt; #include&lt;conio.h&gt; #include&lt;math.h&gt; struct uravn {double a, b, e; void...

Структуры. Помогите найти ошибку в программе
3. Сведения об экзамене содержат следующие данные: дисциплину (программирование, социология,...

Помогите найти ошибку в программе. Вычисление формулы.
Написал программу, которая считает формулу, но она не работает. Компилятор ошибок не выдает, но...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru