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

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

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

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

07.11.2011, 22:02. Просмотров 713. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.11.2011, 22:02
Я подобрал для вас темы с готовыми решениями и ответами на вопрос помогите найти ошибку в программе (C++):

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

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

Помогите найти ошибку в программе - C++
подскажите почему не работает? #include &lt;stdio.h&gt; #include &lt;conio.h&gt; void FormMassive(int A,int B,int IA,int IB,int i,int j) { ...

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

Помогите найти ошибку в программе - C++
Задание: найти по модулю первый и второй максимальний елемент динамичного массива! Код: #include &lt;math.h&gt; #include...

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

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

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


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

Не по теме:

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

0
nemesises
0 / 0 / 0
Регистрация: 01.11.2011
Сообщений: 42
07.11.2011, 22:22  [ТС] #7
уже кинул
вроде тот
0
alkagolik
Заблокирован
07.11.2011, 22:42 #8
Цитата Сообщение от nemesises Посмотреть сообщение
при рэндомном вводе и таком вводе невсегда получается всё норм, пожалуйста выручайте прога нужна на завтра!
опишите подробней что и как
0
nemesises
0 / 0 / 0
Регистрация: 01.11.2011
Сообщений: 42
07.11.2011, 23:17  [ТС] #9
он невсегда удаляет те строки в которых число элементов ненулевых больше нулевых
0
alkagolik
Заблокирован
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
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++
0
alkagolik
Заблокирован
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
nemesises
0 / 0 / 0
Регистрация: 01.11.2011
Сообщений: 42
08.11.2011, 21:22  [ТС] #13
этот код который вы скинули насколько я понял уже отредактированый?
0
alkagolik
Заблокирован
08.11.2011, 22:40 #14
Цитата Сообщение от nemesises Посмотреть сообщение
этот код который вы скинули насколько я понял уже отредактированый?
можно даже смело компилировать. только обратить внимание на то, что файл зовется CMatrix.hpp, и ничто не мешает его оредактировать в CMatrix.h
0
nemesises
0 / 0 / 0
Регистрация: 01.11.2011
Сообщений: 42
09.11.2011, 21:54  [ТС] #15
но тут нету main
он ведь не сможет запустить
0
09.11.2011, 21:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2011, 21:54
Привет! Вот еще темы с ответами:

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

Помогите найти ошибку в программе сортировки массива - C++
Помогите с++ срочно! не сортирует массив! // ConsoleApplication18.cpp: определяет точку входа для консольного приложения. // ...

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

Помогите найти ошибку в программе составления палиндрома числа - C++
Вот програма в которой вводится число а потом высверивается массив из этих чисел, а также составляет палиндром ( палиндром это числа типа...


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

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

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