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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Funky108
2 / 2 / 0
Регистрация: 13.11.2009
Сообщений: 24
#1

Двумерный массив (преобразование масиива по заданному условию) - C++

10.12.2009, 01:00. Просмотров 1099. Ответов 14
Метки нет (Все метки)

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

Намекните плз.

1)Как настроить функцию на ввод и вывод?организовать меню?
2)что значит рядом? типа соседние элементы как в строке так и в столбце?
3)те которые столбцы не подходят их значит и вовсе убрать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2009, 01:00     Двумерный массив (преобразование масиива по заданному условию)
Посмотрите здесь:

C++ Преобразование массива по условию
C++ Преобразование информции из текстового файла в двумерный массив
C++ Одномерный массив. вывод символов по заданному условию
двумерный массив (получить матрицу по условию) C++
C++ Заполнить одномерный массив, обработав данные двумерного массива по заданному условию
C++ Двумерный массив заполнить единицами по условию
Определить номера строк в матрице удовлетворяющих заданному условию C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Funky108
2 / 2 / 0
Регистрация: 13.11.2009
Сообщений: 24
18.12.2009, 15:53  [ТС]     Двумерный массив (преобразование масиива по заданному условию) #2
хелп плз((
valeriikozlov
Эксперт C++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
18.12.2009, 20:40     Двумерный массив (преобразование масиива по заданному условию) #3
Цитата Сообщение от Funky108 Посмотреть сообщение
рядом располагаются не менее заданного количества чисел одного знака
Это количество задается с клавиатуры?
Funky108
2 / 2 / 0
Регистрация: 13.11.2009
Сообщений: 24
18.12.2009, 20:48  [ТС]     Двумерный массив (преобразование масиива по заданному условию) #4
Да.Указывается после ввода а затем вывода тех же элементов элементов массива .
valeriikozlov
Эксперт C++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
18.12.2009, 21:52     Двумерный массив (преобразование масиива по заданному условию) #5
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
#include <iostream.h>
#include <windows.h>
 
int** vvod_vivod(int &n, int &m)
{
    int i, j, **mas;
    cout<<"Vvod kol-vo strok massiva: "<< endl;
    cin>>n;
    cout<<"Vvod kol-vo stolbcov massiva: "<< endl;
    cin>>m;
    mas=new int*[n]; 
    for(i=0; i<n; i++)
       mas[i]=new int[m];
    cout<<"Vvod elementov massiva: "<< endl;
    for(i=0; i<n; i++)
       for(j=0; j<n; j++)
       {
          cout<<"["<<i<<"]["<<j<<"]= ";
          cin>>mas[i][j];
       }
        cout<<"Ishodni massiv:"<<endl;
    for(i=0; i<n; i++)
        {
       for(j=0; j<n; j++)
          cout<<mas[i][j]<<"   ";
          cout<<endl;
        }
    return mas;
 
}
 
int main ()
{
    int **mas, n, m, i,j, kol, temp, **mas_rez, *mas_temp, i_temp=0;
    mas=vvod_vivod(n, m);
    mas_temp=new int[m];
    for(i=0; i<m; i++)
        mas_temp[i]=0;
    cout<<"Vvod kol-vo chisel odnogo znaka: ";
    cin>>kol;
    for(i=0; i<m; i++)
    {       
        temp=0;
        for(j=0; j<n && temp<kol; j++)
        {
            temp=0;
            if(mas[j][i]<0)
            while(j<n && mas[j][i]<0)
            {
                temp++;
                j++;
            }
            else
            while(j<n && mas[j][i]>=0)
            {
                temp++;
                j++;
            }
            j--;
        }
        if(temp>=kol)
        {
            mas_temp[i_temp]=i;
            i_temp++;
        }
    }
    mas_rez=new int*[n]; 
    for(i=0; i<n; i++)
       mas_rez[i]=new int[i_temp];
    for(i=0; i<n; i++)
        for(j=0; j<i_temp; j++)
            mas_rez[i][j]=mas[i][mas_temp[j]];
    cout<<"Poluchenni massiv:"<<endl;
    for(i=0; i<n; i++)
    {
        for(j=0; j<i_temp; j++)
          cout<<mas_rez[i][j]<<"   ";
          cout<<endl;
    }   
    return 0; 
}
Funky108
2 / 2 / 0
Регистрация: 13.11.2009
Сообщений: 24
18.12.2009, 22:48  [ТС]     Двумерный массив (преобразование масиива по заданному условию) #6
А как это будет выглядеть просто на си. С++ еще не проходил.
valeriikozlov
Эксперт C++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
19.12.2009, 09:41     Двумерный массив (преобразование масиива по заданному условию) #7
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
#include <stdio.h>
#include <stdlib.h>
 
int** vvod_vivod(int &n, int &m)
{
        int i, j, **mas;
        printf("Vvod kol-vo strok massiva: ");
        scanf("%d", &n);
        printf("Vvod kol-vo stolbcov massiva: ");
        scanf("%d", &m);
        mas = (int **)malloc (n * sizeof (int *));
        for (i = 0; i < n; i++)
        mas [i] = (int *)malloc (m * sizeof (int));
        for(i=0;i<n;i++)  
           for(j=0;j<m;j++)
           {
               printf("[%d][%d]=",i,j);
               scanf("%d",&mas[i][j]);
            }
         printf("Ishodni massiv\n");
         for(i=0;i<n;i++)  
         {
                 for(j=0;j<m;j++)
                 printf("%d\t",mas[i][j]);  
              printf("\n\n");
        }
        return mas;
 
}
 
int main ()
{
        int **mas, n, m, i,j, kol, temp, **mas_rez, *mas_temp, i_temp=0;
        mas=vvod_vivod(n, m);
        mas_temp = (int *)malloc (m * sizeof (int));
        for(i=0; i<m; i++)
                mas_temp[i]=0;
        printf("Vvod kol-vo chisel odnogo znaka: ");
        scanf("%d", &kol);
        for(i=0; i<m; i++)
        {               
                temp=0;
                for(j=0; j<n && temp<kol; j++)
                {
                        temp=0;
                        if(mas[j][i]<0)
                        while(j<n && mas[j][i]<0)
                        {
                                temp++;
                                j++;
                        }
                        else
                        while(j<n && mas[j][i]>=0)
                        {
                                temp++;
                                j++;
                        }
                        j--;
                }
                if(temp>=kol)
                {
                        mas_temp[i_temp]=i;
                        i_temp++;
                }
        }
        mas_rez=(int **)malloc (n * sizeof (int *));
    for(i=0; i<n; i++)
       mas_rez[i]=(int *)malloc (i_temp * sizeof (int));
        for(i=0; i<n; i++)
                for(j=0; j<i_temp; j++)
                        mas_rez[i][j]=mas[i][mas_temp[j]];
        printf("Poluchenni massiv:\n");
    for(i=0; i<n; i++)
        {
        for(j=0; j<i_temp; j++)
          printf("%d    ", mas_rez[i][j]);
          printf("\n");
        }   
    return 0; 
}
Funky108
2 / 2 / 0
Регистрация: 13.11.2009
Сообщений: 24
20.12.2009, 15:00  [ТС]     Двумерный массив (преобразование масиива по заданному условию) #8
спсибо большое) )

Добавлено через 45 минут
А вот вопрос возник вывод ведь тоже надо офрмлять в виде функции так?
Можно ли переменную к которой мы присвоили значение в главной программе использовать как условие в функции?
valeriikozlov
Эксперт C++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
20.12.2009, 17:02     Двумерный массив (преобразование масиива по заданному условию) #9
Цитата Сообщение от Funky108 Посмотреть сообщение
А вот вопрос возник вывод ведь тоже надо офрмлять в виде функции так?
Вот из начального задания:
Цитата Сообщение от Funky108 Посмотреть сообщение
ввод и вывод массива оформить в виде одной функции.
Это подходит для начального массива. Эту же функцию использовать для полученного массива нельзя, т.к. у них разные правила формирования.

Цитата Сообщение от Funky108 Посмотреть сообщение
Можно ли переменную к которой мы присвоили значение в главной программе использовать как условие в функции?
Вот это поподробнее, что за переменная и что за условие?
Funky108
2 / 2 / 0
Регистрация: 13.11.2009
Сообщений: 24
20.12.2009, 17:14  [ТС]     Двумерный массив (преобразование масиива по заданному условию) #10
Примерно если отбросить все остальное в функции поставить условие

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
int** vvod_vivod(int &n, int &m)
{
        int i, j, **mas;
       
        if (k=0) 
        {
        printf("Vvod kol-vo strok massiva: ");
        scanf("%d", &n);
        printf("Vvod kol-vo stolbcov massiva: ");
        scanf("%d", &m);
                mas = (int **)malloc (n * sizeof (int *));
                for (i = 0; i < n; i++)
            mas [i] = (int *)malloc (m * sizeof (int));
            for(i=0;i<n;i++)  
               for(j=0;j<m;j++)
                   {
                       printf("[%d][%d]=",i,j);
                       scanf("%d",&mas[i][j]);
                    }
                 printf("Ishodni massiv\n");
                 for(i=0;i<n;i++)  
                 {
                         for(j=0;j<m;j++)
                         printf("%d\t",mas[i][j]);  
                          printf("\n\n");
                }
             k=1;
        return mas;
        }
        else
                          
              //вывод массива
}


А в мэйне в начале k=0, затем вход в функцию если k=0 вводим массив и k=1, и выходим из функции функции если k=1 то мы выводим преобразованный массив.

например так
valeriikozlov
Эксперт C++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
20.12.2009, 17:29     Двумерный массив (преобразование масиива по заданному условию) #11
Сделать можно все, только нужно сначало решить оно Вам нужно? Введением одной переменной "k" здесь не обойтись.
Сейчас код сделан так что в функции ввода-вывода создается новый массив, заполняется числами с клавиатуры, затем эти числа выводятся на экран, а по завершении функции она возвращает указатель на созданный массив, который используется в дальнейшей работе.
Если в эту же функцию добавить элемент просто вывода на экран, то функцию нужно переделать достаточно основательно. Нужно будет создание нового массива переносить в основную часть программы из функции. Передавать в функцию только указатель на массив, размеры, текущую строку, и число "k".
Funky108
2 / 2 / 0
Регистрация: 13.11.2009
Сообщений: 24
22.12.2009, 17:31  [ТС]     Двумерный массив (преобразование масиива по заданному условию) #12
А в каких случаях в программе выдает такое сообщение Null pointer assignment
valeriikozlov
Эксперт C++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
22.12.2009, 18:01     Двумерный массив (преобразование масиива по заданному условию) #13
Funky108, Полный код напишите.
Funky108
2 / 2 / 0
Регистрация: 13.11.2009
Сообщений: 24
24.12.2009, 20:42  [ТС]     Двумерный массив (преобразование масиива по заданному условию) #14
я плохо понимаю еще как работают функции )
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
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
int** vvod_vivod(int &n, int &m ,int &k,int &i_temp, int *mas_rez)//,int &i,int &j)
{
    int  **mas,i,j;
 
 
    if (k==0)
    {
    do
    {
        printf("Vvod kol-vo strok massiva: ");
        scanf("%d", &n);
        if(n<0)
            puts("Nepravilniy vvod");
    }
    while(n<0);
 
    do
    {
        printf("Vvod kol-vo stolbcov massiva: ");
        scanf("%d", &m);
        if(m<0)
            puts("Nepravilniy vvod");
    }
    while(m<0);
 
    mas=(int**)malloc ((n*m) * sizeof (int *));
 
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            printf("[%d][%d]=",i,j);
            scanf("%d",&mas[i][j]);
        }
    }
 
    printf("Ishodni massiv\n");
 
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
            printf("%d\t",mas[i][j]);
 
        printf("\n\n");
 
    }
   }
  else
     {
        printf("Poluchenni massiv:\n");
        for(i=0; i<n; i++)
        {
            for(j=0; j<i_temp; j++)
            printf("%d    ", mas_rez[i][j]);
 
        printf("\n");
        }
 
     }
 
return mas;
 
}
 
void main (void)
{
 
    int **mas, n,k,m, i,j, kol, temp,**mas_rez, *mas_temp, i_temp=0;
    clrscr();
    k=0;
    mas=vvod_vivod(n,m,k);
    mas_temp = (int *)malloc (m * sizeof (int));
 
    for(i=0; i<m; i++)
        mas_temp[i]=0;
    do
    {
        printf("Vvod kol-vo chisel odnogo znaka: ");
        scanf("%d", &kol);
        if(kol<0)
            puts("Nepravilniy vvod");
    }
    while(kol<0);
 
 
    for(i=0; i<m; i++)
    {
        temp=0;
        for(j=0; j<n && temp<kol; j++)
        {
            temp=0;
            if(mas[j][i]<0)
            {
                while(j<n && mas[j][i]<0)
                {
                    temp++;
                    j++;
                }
            }
            else
 
                    while(j<n && mas[j][i]>=0)
                    {
                        temp++;
                        j++;
                    }
                 j--;
 
 
            if(temp>=kol)
            {
               mas_temp[i_temp]=i;
                i_temp++;
            }
        }
    }
    mas_rez=(int **)malloc ((n*m)*sizeof(int* ));
 
    for(i=0; i<n; i++)
    {
        for(j=0; j<i_temp; j++)
            mas_rez[i][j]=mas[i][mas_temp[j]];
    }
 
 
    vvod_vivod(k,i,j,mas_rez,i_temp);
 
 
 
 
 
}
в общем надо фунцкцию вывода через K как то сделать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.12.2009, 05:52     Двумерный массив (преобразование масиива по заданному условию)
Еще ссылки по теме:

Найти значение целого числа удовлетворяющего заданному условию C++
Выделить подпоследовательность удовлетворяющую заданному условию C++
Сформировать двумерный массив по условию C++
C++ Сформировать двумерный массив из двух двумерных массивов по условию
Создать двумерный массив из трехмерного массива по условию C++

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

Или воспользуйтесь поиском по форуму:
valeriikozlov
Эксперт C++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
25.12.2009, 05:52     Двумерный массив (преобразование масиива по заданному условию) #15
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
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
int** vvod_vivod(int &n, int &m ,int k=0, int **mas_rez=0)
{
        int  **mas,i,j;
 
 
        if (k==0)
        {
        do
        {
                printf("Vvod kol-vo strok massiva: ");
                scanf("%d", &n);
                if(n<0)
                        puts("Nepravilniy vvod");
        }
        while(n<0);
 
        do
        {
                printf("Vvod kol-vo stolbcov massiva: ");
                scanf("%d", &m);
                if(m<0)
                        puts("Nepravilniy vvod");
        }
        while(m<0);
        mas = (int **)malloc (n * sizeof (int *));
        for (i = 0; i < n; i++)
            mas [i] = (int *)malloc (m * sizeof (int));
        for(i=0;i<n;i++)
        {
                for(j=0;j<m;j++)
                {
                        printf("[%d][%d]=",i,j);
                        scanf("%d",&mas[i][j]);
                }
        }
 
        printf("Ishodni massiv\n");
 
        for(i=0;i<n;i++)
        {
                for(j=0;j<m;j++)
                        printf("%d\t",mas[i][j]);
 
                printf("\n\n");
 
        }
   }
  else
         {
                printf("Poluchenni massiv:\n");
                for(i=0; i<n; i++)
                {
                        for(j=0; j<m; j++)
                        printf("%d    ", mas_rez[i][j]);
 
                printf("\n");
                }
 
         }
 
return mas;
 
}
 
void main (void)
{
 
        int **mas, n,k,m, i,j, kol, temp,**mas_rez, *mas_temp, i_temp=0;
        clrscr();
        k=0;
        mas=vvod_vivod(n,m);
         mas_temp = (int *)malloc (m * sizeof (int));
 
        for(i=0; i<m; i++)
                mas_temp[i]=0;
        do
        {
                printf("Vvod kol-vo chisel odnogo znaka: ");
                scanf("%d", &kol);
                if(kol<0)
                        puts("Nepravilniy vvod");
        }
        while(kol<0);
 
 
        for(i=0; i<m; i++)
        {
                temp=0;
                for(j=0; j<n && temp<kol; j++)
                {
                        temp=0;
                        if(mas[j][i]<0)
                        {
                                while(j<n && mas[j][i]<0)
                                {
                                        temp++;
                                        j++;
                                }
                        }
                        else
 
                                        while(j<n && mas[j][i]>=0)
                                        {
                                                temp++;
                                                j++;
                                        }
                                 j--;
 
 
                        if(temp>=kol)
                        {
                           mas_temp[i_temp]=i;
                                i_temp++;
                        }
                }
        }
        mas_rez=(int **)malloc (n * sizeof (int *));
        for(i=0; i<n; i++)
            mas_rez[i]=(int *)malloc (i_temp * sizeof (int));
 
        for(i=0; i<n; i++)
        {
                for(j=0; j<i_temp; j++)
                        mas_rez[i][j]=mas[i][mas_temp[j]];
        }
 
 
        vvod_vivod(n,i_temp,k=1,mas_rez);
 
}
Yandex
Объявления
25.12.2009, 05:52     Двумерный массив (преобразование масиива по заданному условию)
Ответ Создать тему
Опции темы

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