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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
mary1010
0 / 0 / 0
Регистрация: 17.09.2012
Сообщений: 32
#1

Матрицы. Программа, которая удаляет столбец матрицы, содержащий максимальный ее элемент - C++

22.02.2013, 01:09. Просмотров 1355. Ответов 27
Метки нет (Все метки)

Я новичок в с++...поэтому оооочень нужна Ваша помощь!!!

Необходимо написать программу, которая удаляет столбец матрицы, содержащий максимальный ее элемент. Элементы
вводятся с клавиатуры и еще нужно использовать функции.

У меня почему-то не получается вызвать функции и ошибки в DeleteColumn типа:
1.[C++ Error] Unit1.cpp(29): E2188 Expression syntax
2.[C++ Error] Unit1.cpp(46): E2451 Undefined symbol 'i'
.....
3.[C++ Warning] Unit1.cpp(71): W8004 't' is assigned a value that is never used
.....

вот собственно код:
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
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#pragma argsused
#include <iostream>
#include <math.h>
#include <conio.h>
#include <stdio.h>
#include <ctime>
//---------------------------------------------------------------------------
using namespace std;
 
int** createMatrix(int);
void fillArray(int**, int);
void printArray(int**, int);
void DeleteColumn(int** inArray,  int width);
 
 int main()
{
int** matrix;
int length = 0;
 
matrix = createMatrix(length);
 
fillArray(matrix,length);
cout << "Matrix which is filled manually:" << endl;
printArray(matrix,length);
 
DeleteColumn(int** inArray,  int width);
cout << "New matrix:" << endl;
printArray(matrix,length);
system("pause");
}
 
int** createMatrix(int width)
{
int** matrix = new int*[width];
for (int i = 0; i < width; i++)
matrix [i] = new int[width];
return matrix;
}
//------------------------
void DeleteColumn(int** inArray,  int width )
{
 //searching max
 int l = inArray[i][j] ;
 int s=0;
 int t=0;
        for(i=0;i<width;i++)
           for(j=0;j<width;j++)
                if(inArray[i][j]>l)
                {
                l=inArray[i][j];
                t=i;
                s=j;
                }
        cout<<"max element=";
        cout<<l<<endl;
 
 //deleting column of a matrix
 for (j=0; j<width; j++)
   for (i=0;i<width; i++)
        if (inArray[i][j]=l)
               {
                       for (i=0; i<width; i1++)
                            for (i1=j; i1<(width-1); i1++)
                                 inArray[i][i1]=inArray[i][i1+1];
                       i=0;
                                         
                }
 }
//-------------------------
void fillArray(int** inArray, int width)
{
        for(int i = 0; i<width; i++)
           for(int j=0; j<width; j++)
{
 
cout << "Enter cell [" << i <<"," << j << "]"<< endl;
cin >> inArray[i][j];
}
 
}
 
void printArray(int** inArray, int width)
{
        for(int i = 0; i<width; i++){
          for(int j=0; j<width; j++)
{
cout << inArray[i][j] << " ";
}
cout << endl;
        }
 
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.02.2013, 01:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Матрицы. Программа, которая удаляет столбец матрицы, содержащий максимальный ее элемент (C++):

Поменять местами столбцы матрицы: столбец, содержащий максимальный элемент матрицы, и столбец, содержащий минимальный элемент матрицы. - C++
В матрице, состоящей из положительных действительных чисел поменять местами два столбца: столбец, содержащий максимальный элемент...

Удалить столбец, содержащий максимальный элемент матрицы. - C++
Дана матрица размера M × N. Удалить столбец, содержащий максимальный элемент матрицы.

Удалить столбец, содержащий максимальный элемент матрицы - C++
Дана матрица размера M × N. Удалить столбец, содержащий максимальный элемент матрицы

Дана матрица размера 4х9. Обнулить столбец матрицы, содержащий ее максимальный элемент - C++
Дана матрица размера 4х9. Обнулить столбец матрицы, содержащий ее максимальный элемент.

Максимальный элемент матрицы заменить на нуль и вывести на печать угол матрицы, в котором расположен этот максимальный элемент - C++
Помогите, пожалуйста, добить программу: -Максимальный элемент матрицы заменить на нуль и вывести на печать угол матрицы, в котором...

Дана матрица размера M × N. Продублировать столбец матрицы, содержащий ее минимальный элемент. - C++
Дана матрица размера M × N. Продублировать столбец матрицы, содержащий ее минимальный элемент. Помогите пожалуйста!!!

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
22.02.2013, 02:28 #16
Цитата Сообщение от mary1010 Посмотреть сообщение
int length = 0;
matrix = createMatrix(length);
что ты тут делаешь? Объясни.
Ты хоть сам понимаешь, что пишешь? Или кто-то тебе написал отрывками, а ты копируешь себе.
0
vua72
415 / 415 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
22.02.2013, 02:39 #17
mary1010, проверьте свой код, напишите алгоритм словами на листике, иначе никак. Вы выделяете память под массив какого размера? И где?

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
for (j = 0; j < width; j++)
        for (i = 0; i < width; i++)
            if (inArray[i][j] == l) {
                for (i = 0; i < width; i++)
                    for (i1 = j; i1 < (width - 1); i1++)
                        inArray[i][i1] = inArray[i][i1 + 1];
                i = 0;
 
            }
и почему вы не можете выйти из этого цикла?
1
mary1010
0 / 0 / 0
Регистрация: 17.09.2012
Сообщений: 32
22.02.2013, 02:45  [ТС] #18
Kuzia domovenok, length - размерность матрицы
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
matrix = createMatrix(length)
- создание матрицы с заданной размерностью....я так понимаю...
части кода писали на лекции и я включила их в программу, если что-то получается не совсем корректно, то прошу извинить, я только на 1 курсе и с преподавателем не очень повезло
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
22.02.2013, 03:09 #19

Не по теме:

Цитата Сообщение от mary1010 Посмотреть сообщение
я только на 1 курсе и с преподавателем не очень повезло
ты только УЖЕ на первом курсе и преподаватель никому ничего не обязан


Впрочем, твоё дело.
По теме. Ты пытаешься создать матрицу нулевого размера. Где задаётся length?
1
mary1010
0 / 0 / 0
Регистрация: 17.09.2012
Сообщений: 32
22.02.2013, 03:13  [ТС] #20
Kuzia domovenok,
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
преподаватель никому ничего не обязан
знаю, что не обязан...но тяжело...
спасибо, буду разбираться
0
vua72
22.02.2013, 18:51
  #21

Не по теме:

Цитата Сообщение от mary1010 Посмотреть сообщение
- создание матрицы с заданной размерностью....я так понимаю...
части кода писали на лекции и я включила их в программу, если что-то получается не совсем корректно, то прошу извинить, я только на 1 курсе и с преподавателем не очень повезло
\
Вы знаете, тут препод конечно виноват, но за вас думать никто не будет, элементарно у вас, извините, глупости написаны.
Возьмите простую книгу для новичков, может Прата подойдет, почитайте про типы данных, переменные, массивы. Сложного ничего нет.
И еще, вы верите, что удаляете столбец из массива? Или вы пытаетесь его удалить из вывода на экран? Тут вам точно не повезло с преподавателем.

1
mary1010
0 / 0 / 0
Регистрация: 17.09.2012
Сообщений: 32
22.02.2013, 19:21  [ТС] #22
vua72, с функциями разобралась, работает ввод/вывод и поиск максимального элемента(я его модифицировала):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void findMax(int** inArray,  int width )
{
 
 int i=0, j=0;
//searching max
 
 int max = inArray[i][j] ;
        for(i=0;i<width;i++)
           for(j=0;j<width;j++)
                if(inArray[i][j]>max)
                {
                max=inArray[i][j];
                }
        cout<<"max element=";
        cout<<max<<endl;
 
  }
и по поводу удаления:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int DeleteColumn(int** inArray,  int  width);
 {
        for(int i = 0; i < width; i++)                      //цикл по строкам
        {
          int* c = new int[width-1]; //новая матрица, в которой на 1 столбец меньше, чем в исходной
                for(int j = 0, k = 0; j < width; j++)   //цикл по столбцам
                {
                 if ( j != max[j])      //если j не равно столбцу с максимальным элементом 
                 {
                    c[k] = inArray[i][j];  //копируем элемент в новую матрицу
                    k++;                                           
                 }
                }
 int* old = inArray[i];                                      
 inArray[i] = c;
 delete[] old;
        }
}
здесь вот такая ошибка во 2 строке:[C++ Error] Unit1.cpp(62): E2040 Declaration terminated incorrectly

Добавлено через 13 минут
и еще:[C++ Error] Unit1.cpp(77): E2335 Overloaded 'max' ambiguous in this context
0
vua72
415 / 415 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
22.02.2013, 20:47 #23
Уберите точку с запятой в первой строке.
А где вы объявили массив max?
1
mary1010
0 / 0 / 0
Регистрация: 17.09.2012
Сообщений: 32
22.02.2013, 22:16  [ТС] #24
vua72, я думаю, что номер столбца с максимальным элементом должен возвращаться в функции findMax и попадать в DeleteColumn, как это сделать?
0
vua72
415 / 415 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
22.02.2013, 22:38 #25
int findMax() {
...
return col_with_max;}
1
mary1010
0 / 0 / 0
Регистрация: 17.09.2012
Сообщений: 32
23.02.2013, 02:06  [ТС] #26
vua72, самое важное для меня сейчас - это понять как из findMax ПОЛУЧИТЬ номер столбца с макс. элементом ???сам элемент известен...а дальше...
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
23.02.2013, 02:09 #27
вернуть номер столбца, не?
что не ясно то?
пусть findMAX возвращает тип инт - номер столбца.
C++
1
2
void findMax(int** inArray,  int width )
{...
1
vua72
415 / 415 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
25.02.2013, 02:46 #28
Смотрите, у вас в функции код, который вычисляет максимальное значение, вам в этот код
Цитата Сообщение от mary1010 Посмотреть сообщение
if(inArray[i][j]>max)
* * * * * * * * {
* * * * * * * * max=inArray[i][j];
* * * * * * * * }
нужно добавить запоминание номера столбца. Но это сработает, если у вас ОДНО максимальное значение, если нет, то лучше запомнить максимальное, создать массив, число элементов в котором равно числу столбцов, например, если в столбце есть максимум ставим 1, если нет - 0.
Затем удалить все столбцы, в которых вспомогательный массив содержит 1.
Просто сделайте еще одну функцию, которая заполнит такой массив.
ЗЫ. Я думаю, что правильней первоначальный и вспомогательный массив сделать динамическими, затем на основе вспомогательного массива (узнаем размер) создать новый, в который переписать значения из "правильных" столбцов, исходный - удалить и присвоить указатель на новый массив первоначальному.
В таком случае, вы действительно удалите столбцы.

Добавлено через 2 часа 8 минут
По нормальному нужно использовать стандартные контейнеры, ниже код в стиле С.
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
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip>
using namespace std;
 
int ** alloc_matr(int n_row, int m_col);
int * alloc_vect(int n_elem);
void destroy_matr(int ** matr, int n_row, int m_col);
void destroy_vect(int * vect);
void input_matr(int ** matr, int n_row, int m_col);
void print_matr(int ** matr, int n_row, int m_col);
int find_max(int ** matr, int n_row, int m_col);
void del_column(int ** oldmatr, int **newmatr, int *vect, int n_row, int m_col);
int new_m(int **matr, int *vect, int n_row, int m_col);
int main() {
    int n = 4, m = 5;
    int **a = alloc_matr(n, m);
    int *v = alloc_vect(m);
    input_matr(a, n, m);
    print_matr(a, n, m);
    int mm = new_m(a, v, n, m);
    cout << "\nmm=" << mm << "\n";
    int **new_a = alloc_matr(n, mm);
    del_column(a, new_a, v, n, m);
    destroy_matr(a, n, m);
    a = new_a;
    print_matr(a, n, mm);
    destroy_matr(a, n, m);
    destroy_vect(v);
    return 0;
}
 
int ** alloc_matr(int n_row, int m_col) {
    int **matrix;
    if (n_row == 0 || m_col == 0)
        return 0;
    else {
        matrix = new int*[n_row];
        for (int i = 0; i < n_row; ++i)
            matrix[i] = new int[m_col]();
    }
    return matrix;
}
int * alloc_vect(int n_elem) {
    int *v;
    if (n_elem == 0)
        return 0;
    else
        v = new int[n_elem]();
    return v;
}
 
void destroy_matr(int ** matr, int n_row, int m_col) {
    if (!matr) {
        std::cout << "Matrix not allocated";
        exit(1);
    } else {
        for (int i = 0; i < n_row; ++i)
            delete[] matr[i];
        delete []matr;
    }
}
void destroy_vect(int * vect) {
    if (!vect) {
        std::cout << "Vector is not allocated";
        exit(1);
    } else
        delete[] vect;
}
void input_matr(int ** matr, int n_row, int m_col) {
    srand(time(0));
    for (int i = 0; i < n_row; ++i)
        for (int j = 0; j < m_col; ++j)
            matr[i][j] = rand() % 75; // cout << "\nVvod elementa"; cin >> matr[i][j]
}
void print_matr(int ** matr, int n_row, int m_col) {
    for (int i = 0; i < n_row; ++i) {
        for (int j = 0; j < m_col; ++j)
            cout << setw(4) << matr[i][j];
        cout << endl;
    }
}
void del_column(int ** oldmatr, int **newmatr, int *vect, int n_row,
        int m_col) {
    for (int j = 0, k = 0; j < m_col; ++j)
        if (vect[j])
            continue;
        else {
            for (int i = 0; i < n_row; ++i)
                newmatr[i][k] = oldmatr[i][j];
            ++k;
        }
}
 
int find_max(int ** matr, int n_row, int m_col) {
    int max = 0;
    for (int i = 0; i < n_row; ++i)
        for (int j = 0; j < m_col; ++j)
            if (max < matr[i][j])
                max = matr[i][j];
    return max;
}
 
int new_m(int **matr, int *vect, int n_row, int m_col) {
    int count_m = 0;
    int max = find_max(matr, n_row, m_col);
    cout << "\n max= " << max << "\n";
    for (int j = 0, k = 0; j < m_col; ++j, ++k) {
        for (int i = 0; i < n_row; ++i)
            if (matr[i][j] == max) {
                vect[k] = 1;
                count_m++;
                break;
            }
    }
    return m_col - count_m;
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2013, 02:46
Привет! Вот еще темы с ответами:

Найти сумму элементов в строке содержащий максимальный элемент матрицы - C++
Здравствуйте. Помогите пожалуйста решить задачу: Дана прямоугольная матрица разм. 3х4. Найти сумму элементов в строке содержащий...

Сформировать одномерный массив как столбец матрицы,содержащий минимальный элемент на побочной диагонали - C++
2. Сформировать одномерный массив как столбец матрицы, содержащий минимальный элемент на побочной диагонали.

В строке содержащий максимальный элемент матрицы, подсчитать сумму элементов по заданной формуле - C++
Вечер добрый, последняя лаба за семестр, состоит из двух заданий(первое я сделал вообще на изи), меня интересует код... ну как интересует,...

Максимальный элемени матрицы заменить на нуль и вывести на печать угол матрицы, в котором расположен этот максимальный элемент - C++
собственно сабж. буду очень благодарен тому кто поможет,а то я на грани отчисления,а уроки по c++ пролежал дома с переломом ноги =(


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.02.2013, 02:46
Ответ Создать тему
Опции темы

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