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

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

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

Удаление заданого элемента матрицы,двумерные массивы - C++

16.03.2012, 17:41. Просмотров 1299. Ответов 24
Метки нет (Все метки)

МОДИФИКАЦИЯ ДВУМЕРНЫХ МАССИВОВ
Дана прямоугольная матрица (NxM, где 1<=N<=10, 1<=M<=10).
Удалить строчку с максимальным количеством ненулевых элементов. Ввод, вывод и удаление реализовать в виде отдельных функций.
помогите с кодом
я просто не представляю даже с чего мне начинать=((
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2012, 17:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удаление заданого элемента матрицы,двумерные массивы (C++):

Двумерные массивы (матрицы) - C++
Добрый день!!!!!! Помогите решить такую задачу: Характеристикой столбца целочисленной матрицы назовём сумму модулей его отрицательных...

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

Двумерные массивы матрицы - C++
Что не так в программе помогите пожалуйста!! #include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; int main() { ...

Двумерные массивы 1. Характеристикой столбца целочисленной матрицы ... - C++
подскажите пожалуста, есть задание: &quot;Характеристикой столбца целочисленной матрицы назовем сумму модулей его отрицательных нечетных...

Двумерные массивы. Подсчитать число элементов матрицы - C++
помогите пожалуйста написать программы 2.Подсчитать число элементов матрицы Q(9x11), остаток от деления которых на пять равен единице.

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Raikerian
9 / 9 / 1
Регистрация: 10.05.2011
Сообщений: 101
24.03.2012, 23:19 #16
Ну вот функция удаления (при уже найденном номере строки)
C++
1
2
3
4
5
6
void delete_m (int A[100][100], int num, int N, int M)
{
    for (int i=num; i<N; ++i)
        for (int j=0; j<M; ++j)
            A[i][j]=A[i+1][j];
}
передаются значения delete_m(имя_массива, номер_удаляемой_строки, N, M). По алгоритму мы заменяем элементы текущей строки на элементы следующей по циклу.
При выводе (или до вывода в теле самой программы) у N следует отнять 1 так как теперь последняя строка пустая.
0
лизи
0 / 0 / 0
Регистрация: 14.11.2011
Сообщений: 104
24.03.2012, 23:30  [ТС] #17
Raikerian, я видимо не правильно ищу строку потому подкоретирова функцию удаления под вашу все равно он вывод только вторую сторочку и трет остальные
0
Raikerian
9 / 9 / 1
Регистрация: 10.05.2011
Сообщений: 101
24.03.2012, 23:38 #18
Цитата Сообщение от лизи Посмотреть сообщение
Raikerian, я видимо не правильно ищу строку потому подкоретирова функцию удаления под вашу все равно он вывод только вторую сторочку и трет остальные
Попробую написать так, может легче будет подкорректировать:
C++
1
2
3
for (int i=НОМЕР_УДАЛЯЕМОЙ СТРОКИ; i<N; ++i)
                for (int j=0; j<M; ++j)
                        A[i][j]=A[i+1][j];
N и M строки и столбцы соответственно при инициализации массива.
Тоесть если у вас temp ваш номер то:

C++
1
2
3
for (int i=temp; i<N; ++i)
                for (int j=0; j<M; ++j)
                        A[i][j]=A[i+1][j];
Ну и соответственно в теле программы после инициализации функции выставьте N--;

Эта и вся функция удаления. Алгоритм должен быть рабочим и удалять только нужную строку. Попробуйте любую цифру вместо temp поставить и посмотреть удалит ли эту строку компилятор.
Кстати следует учитывать что строки и столбцы в массивах с 0 нумеруются же, поэтому если в коде удалять строчку 2 то удалится 3-я строка.
0
лизи
0 / 0 / 0
Регистрация: 14.11.2011
Сообщений: 104
24.03.2012, 23:43  [ТС] #19
Цитата Сообщение от Raikerian Посмотреть сообщение
Код C++
1
2
3
for (int i=temp; i<N; ++i)
* * * * * * * * for (int j=0; j<M; ++j)
* * * * * * * * * * * * A[i][j]=A[i+1][j];
Ну и соответственно в теле программы после инициализации функции выставьте N--;
ну вот у меня так удаление строчки и прописано
единсвенная разница у меня было улсовие
C
1
if (*nl-1!=i)
и еще ретерн стоял в одном случае
0
Raikerian
9 / 9 / 1
Регистрация: 10.05.2011
Сообщений: 101
25.03.2012, 00:02 #20
Выложите пожалуйста полный код вашей программы)
0
лизи
0 / 0 / 0
Регистрация: 14.11.2011
Сообщений: 104
25.03.2012, 00:05  [ТС] #21
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
#include <stdio.h>
 
int output_arr(int arr[25][25],int nl, int nc) //Вывод массива на экран
{ int i,j;
 
for(i=0;i<nl;i++)
{
for(j=0;j<nc;j++)
{
printf("%d\t",arr[i][j]);
}
printf("\n");
return 0;}
 
}
int input_arr(int arr[25][25],int nl, int nc) //Ввод массива с клавиатуры
{ int i,j;
for(i=0;i<nl;i++)
{for(j=0;j<nc;j++)
{ printf("a[%d][%d]=",i+1,j+1);scanf("%d",&arr[i][j]);}
printf("\n");
} return 0;}
 
int del(int arr[25][25],int *nl, int nc)//Удаление строки
{int i,j,max,temp,count[25];
 
for(i=0;i<*nl;i++)
count[i]=0;
 
for ( i=0; i<*nl; i++)
{
for ( j=0; j<nc; j++)
{
if (arr[i][j] != 0)
{
count[i] = count[i] + 1;
}
}
}
 
for ( i=0; i<*nl; i++) // Ищем строку с максимальным элементом
{
if (count[i] > max)
{
max = count[i];
temp = i; //Сохраняем номер строки
 
}
}
 
 //if (*nl!=i)
 //for (i=temp;i<*nl;i++) //Удаляем эту строку
 //for (j=0;j<nc;j++)
 //arr[i][j]=arr[i+1][j];
 for (  i=temp; i<nl; ++i)
                for (  j=0; j<nc; ++j)
                        arr[i][j]=arr[i+1][j];
 
 *nl--;
 //return 0;
}
 
int main()
{
int nl, nc, arr[25][25];
scanf("%d %d",&nl,&nc);
input_arr(arr,nl,nc);
del(arr, &nl, nc);
output_arr(arr,nl,nc);
return 0;
}
0
Raikerian
9 / 9 / 1
Регистрация: 10.05.2011
Сообщений: 101
25.03.2012, 00:20 #22
Исправил:
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
#include <stdio.h>
using namespace std;
void output_arr(int arr[25][25],int nl, int nc) //Вывод массива на экран
{
    int i,j;
    for(i=0;i<nl;i++)
    {
        for(j=0;j<nc;j++)
        {
            printf("%d\t",arr[i][j]);
        }
        printf("\n");
    }
}
void input_arr(int arr[25][25],int nl, int nc) //Ввод массива с клавиатуры
{
    int i,j;
    for(i=0;i<nl;i++)
    {
        for(j=0;j<nc;j++)
        {
            printf("a[%d][%d]=",i+1,j+1);scanf("%d",&arr[i][j]);}
        printf("\n");
    }
}
void del(int arr[25][25],int nl, int nc)//Удаление строки
{
    int i,j,max=0,temp,count[25];
    for(i=0;i<nl;i++)
        count[i]=0;
    for (i=0; i<nl; i++)
    {
        for ( j=0; j<nc; j++)
        {
            if (arr[i][j] != 0)
            {
                count[i] = count[i] + 1;
            }
        }
    }
 
    for ( i=0; i<nl; i++) // Ищем строку с максимальным элементом
    {
        if (count[i] > max)
        {
            max = count[i];
            temp = i; //Сохраняем номер строки
        }
    }
    for (i=temp; i<nl; ++i)
        for (j=0; j<nc; ++j)
            arr[i][j]=arr[i+1][j];
}
int main()
{
    int nl, nc, arr[25][25];
    scanf("%d %d",&nl,&nc);
    input_arr(arr,nl,nc);
    del(arr, nl, nc);
    nl--;
    output_arr(arr,nl,nc);
    return 0;
}
Собственно зачем вовсе использовался указатель а затем ссылка на него? Убрал. Затем, max надо было инициализировать при объявлении (приравнять нулю).
Так же никчему использовать функции типа int, ведь нам ничего возвращать не надо (никаких значений). Изменил на void.
Ну всё вроде, проверяйте.
1
лизи
0 / 0 / 0
Регистрация: 14.11.2011
Сообщений: 104
25.03.2012, 00:33  [ТС] #23
Raikerian, воуу,заработало,cпасибо огромное)
0
Raikerian
9 / 9 / 1
Регистрация: 10.05.2011
Сообщений: 101
25.03.2012, 00:40 #24
И еще выше не указал, nl--; я засунул в тело самой программы (функция main) т.к. все что выполняется в функциях выше (void) остается в их пределах.
1
лизи
0 / 0 / 0
Регистрация: 14.11.2011
Сообщений: 104
25.03.2012, 00:42  [ТС] #25
Raikerian, я уже заметила что nl там)) спасибо огромное))
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2012, 00:42
Привет! Вот еще темы с ответами:

Двумерные массивы. Определить, есть ли в заданных матрицах столбцы, содержащие по два отрицательных элемента - C++
Прошу помощи в создании данной программы: Даны матрицы В (m,n) и С (n,m), заполненные случайным образом. Определить, есть ли в заданных...

C++ Двумерные массивы(матрицы),работа с элементами главной диагонали - C++
Уважаемые коллеги, прошу помощи в решении парочки задачек,уж мозг в Си не &quot;варит&quot;,не клеится с его структурой... 1.В каждой строке...

Двумерные массивы. Четные строки матрицы сдвинуть на К элементов вправо. - C++
Используя функции сформировать двумерный массив. Все четные строки матрицы сдвинуть циклически на К элементов вправо. Первую часть...

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


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

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

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