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

Матрица (Не получается ввести с клавиатуры произвольные число строк и столбцов массива) - C++

Восстановить пароль Регистрация
 
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
17.04.2013, 23:09     Матрица (Не получается ввести с клавиатуры произвольные число строк и столбцов массива) #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
//сортировка двухмерного массива
//по возрастанию
 
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include <windows.h>
 
using namespace std;
int main()
{
   SetConsoleCP(1251);
   SetConsoleOutputCP(1251);
    srand(time(NULL));
   int str =1;
   int stolb=1;
   int mass[str][stolb];
    int temp;
    //заполняем двухмерный массив и выводим на экран
     cout <<"Введите количество строк"<<"\n";
     cin >> str;
     cout<<"Введите количество столбцов"<< "\n";
     cin >> stolb;
     cout<<"\n";
 
       cout<<"До сортировки""\n";
    for(int i=0;i<str;i++)
    {
        for(int j=0;j<stolb;j++)
         {
            mass[i][j]=1+rand()%100;
            cout<<mass[i][j]<<"\t";
         }
        cout<<"\n";
    }
    //Сортируем массив
 
    for(int i=0;i<=(str*stolb);i++)//колличество проходов
    {
        //в строках упорядочиваем
 
       for(int i=0;i<str;i++)
         {
           for(int j=0;j<stolb-1;j++)
            {
              if(mass[i][j]>mass[i][j+1])
               {
                 temp=mass[i][j];
                 mass[i][j]=mass[i][j+1];
                 mass[i][j+1]=temp;
               }
            }
         }
       //в столбах упорядочиваем
 
       for(int k=0;k<stolb;k++)
         {
           for(int l=0;l<str-1;l++)
            {
              if(mass[l][k]>mass[l][k+1])
               {
                 temp=mass[l][k];
                 mass[l][k]=mass[l][k+1];
                 mass[l][k+1]=temp;
               }
           }
        }
     }
 
    //вывод на экран после сортировки
       cout<<"После сортировки ""\n";
    for(int i=0;i<str;i++)
    {
        for(int j=0;j<stolb;j++)
        {
            cout<<mass[i][j]<<"\t";
        }
        cout<<"\n";
    }
 
return 0;
}
В нем все правильно работает когда я инициализирую str и stolb любыми целыми числами,а при вводе с клавиатуры пропадает одно значение,а почему не пойму.Я так понимаю,что не верно делаю ввод str и stolb.
Пожалуйста подскажите кто сможет.За ранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.04.2013, 23:09     Матрица (Не получается ввести с клавиатуры произвольные число строк и столбцов массива)
Посмотрите здесь:

Ввести с клавиатуры массив, распределить память для его размещения и ввести int значения этого массива C++
C++ Не получается заполнение двумерного массива случайными числами с указанием количества строк и столбцов.
C++ Привет. В программе вводится количество строк и столбцов. Мы можем ввести больше столбцов чем задали.
C++ Ввести число с клавиатуры, потом записать это число в текстовой файл
Напишите программу, которая позволяет пользователю ввести число, а затем генерирует таблицу размером 20 строк на 10 столбцов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
18.04.2013, 00:58     Матрица (Не получается ввести с клавиатуры произвольные число строк и столбцов массива) #2
И Вам доброго времени суток. Вы в строке
C++
1
int mass[str][stolb];
инициализируете массив размером 1 на 1, а потом вводите новые значения str и stolb, возникает вопрос,когда у вас i и j становятся больше 0(хотя бы одно из них), то куда Вы пишите значение рендома?
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
18.04.2013, 01:11  [ТС]     Матрица (Не получается ввести с клавиатуры произвольные число строк и столбцов массива) #3
Именно здесь я и не могу понять,потому что ,если я пишу просто
C++
1
2
int str =5;
int stolb=5;
и убираю
C++
1
2
3
4
 cout <<"Введите количество строк"<<"\n";
     cin >> str;
     cout<<"Введите количество столбцов"<< "\n";
     cin >> stolb;
все работает правильно.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
18.04.2013, 01:11     Матрица (Не получается ввести с клавиатуры произвольные число строк и столбцов массива) #4
То что вы читаете ввод пользователя и потом пытаетесь читать NxM массив это конечно хорошо, но вы не думали что места то наверное тоже надо выделять под NxM элементов?
Чтобы сделать это динамически вам нужно познакомиться с указателями и объявить что-то типа
C++
1
2
3
int** array2D = new int[M];
for(int i=0;i<M;i++)
 array2D[i] = new int[N];
это для массива MxN.

Статически задавать размер массива числом, которое будет введено при выполнении нельзя, те
C++
1
2
3
4
int x;
int y;
cin>>x>>y;
int array2D[x][y];
приведёт к ошибке.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
18.04.2013, 01:15     Матрица (Не получается ввести с клавиатуры произвольные число строк и столбцов массива) #5
Gepar, а еще лучше не создавать двумерный массив, а создать одномерный,но размером M*N.

Добавлено через 1 минуту
и не
Цитата Сообщение от Gepar Посмотреть сообщение
int** array2D = new int[M];
а
C++
1
int** array2D = new int*[M];
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
18.04.2013, 01:21  [ТС]     Матрица (Не получается ввести с клавиатуры произвольные число строк и столбцов массива) #6
Так в задании двухмерный,с одномерным я с горем пополам справляюсь,а так я совсем запутаюсь.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
18.04.2013, 01:23     Матрица (Не получается ввести с клавиатуры произвольные число строк и столбцов массива) #7
Genn55, тогда пробуйте двумерные динамические массивы, как правильно указал Вам Gepar.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.04.2013, 22:16     Матрица (Не получается ввести с клавиатуры произвольные число строк и столбцов массива)
Еще ссылки по теме:

Дана матрица, состоящая из М строк и N столбцов C++
Как ввести массив строк с клавиатуры? C++
Обратная матрица (перестановка строк и столбцов) C++

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

Или воспользуйтесь поиском по форуму:
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
18.04.2013, 22:16  [ТС]     Матрица (Не получается ввести с клавиатуры произвольные число строк и столбцов массива) #8
Если я правильно понял,мне нужно создать 2 динамических двумерных массива?

Добавлено через 20 часов 47 минут
Спасибо,что подсказали в какую сторону копать.Переписал код,но все равно дает ошибку не понимаю почему столбцы не сортируются.В статическом все нормально,а в динамическом нет, в чем дело не пойму.Заполняется правильно,а работает с ошибками.
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
//сортировка двухмерного массива
//по возрастанию
 
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include <windows.h>
 
using namespace std;
int main()
{
   SetConsoleCP(1251);
   SetConsoleOutputCP(1251);
   srand(time(NULL));
    int str,stolb,temp;
 
    cout <<"Введите количество строк"<<"\n";
    cin >> str;
    cout<<"Введите количество столбцов"<< "\n";
    cin >> stolb;
    cout<<"\n";
    cout<<"До сортировки""\n";
 
    // динамическое создание двумерного массива
    int **mass = new int* [1]; // строк в массиве
    for (int i = 0; i < str; i++)
        mass[i] = new int [1]; // столбцов
    // заполнение массива и вывод на экран
     for(int i=0;i<str;i++)
    {
        for(int j=0;j<stolb;j++)
         {
            mass[i][j]=1+rand()%100;
            cout<<mass[i][j]<<"\t";
         }
        cout<<"\n";
    }
        //Сортируем массив
    for(int i=0;i<=(str*stolb);i++)//колличество проходов
    {
        //в строках упорядочиваем
       for(int i=0;i<str;i++)
         {
           for(int j=0;j<stolb-1;j++)
            {
              if(mass[i][j]>mass[i][j+1])
               {
                 temp=mass[i][j];
                 mass[i][j]=mass[i][j+1];
                 mass[i][j+1]=temp;
               }
            }
         }
       //в столбах упорядочиваем
          for(int x=0;x<stolb;x++)
         {
           for(int z=0;z<str-1;z++)
            {
              if(mass[z][x]>mass[z][x+1])
               {
                 temp=mass[z][x];
                 mass[z][x]=mass[z][x+1];
                 mass[z][x+1]=temp;
               }
           }
        }
 
     }
    //вывод на экран после сортировки
    cout<<"После сортировки ""\n";
    for(int i=0;i<str;i++)
    {
        for(int j=0;j<stolb;j++)
        {
            cout<<mass[i][j]<<"\t";
        }
        cout<<"\n";
    }
    // удаление двумерного динамического массива
    for (int i = 0; i < str; i++)
        delete []mass[i];
return 0;
}
В этом коде дает ошибку.
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<iostream>
#include<stdlib.h>
#include<time.h>
#include <windows.h>
 
using namespace std;
int main()
{
   SetConsoleCP(1251);
   SetConsoleOutputCP(1251);
    srand(time(NULL));
    const int str=3;
    const int stolb=3;
    int mass[str][stolb];
    int temp;
    //заполняем двухмерный массив и выводим на экран
    cout<<"До сортировки""\n\n";
    for(int i=0;i<str;i++)
    {
        for(int j=0;j<stolb;j++)
         {
            mass[i][j]=1+rand()%100;
            cout<<mass[i][j]<<"\t";
         }
        cout<<"\n\n";
    }
    //Сортируем массив
    for(int i=0;i<=(str*stolb);i++)//колличество проходов
    {
        //в строках упорядочиваем
       for(int i=0;i<str;i++)
         {
           for(int j=0;j<stolb-1;j++)
            {
              if(mass[i][j]>mass[i][j+1])
               {
                 temp=mass[i][j];
                 mass[i][j]=mass[i][j+1];
                 mass[i][j+1]=temp;
               }
            }
         }
       //в столбах упорядочиваем
       for(int x=0;x<stolb;x++)
         {
           for(int z=0;z<str-1;z++)
            {
              if(mass[z][x]>mass[z][x+1])
               {
                 temp=mass[z][x];
                 mass[z][x]=mass[z][x+1];
                 mass[z][x+1]=temp;
               }
           }
        }
     }
    //вывод на экран после сортировки
    cout<<"После сортировки по возрастанию""\n\n";
    for(int i=0;i<str;i++)
    {
        for(int j=0;j<stolb;j++)
        {
            cout<<mass[i][j]<<"\t";
        }
        cout<<"\n\n";
    }
return 0;
}
А в этом все работает.
Yandex
Объявления
18.04.2013, 22:16     Матрица (Не получается ввести с клавиатуры произвольные число строк и столбцов массива)
Ответ Создать тему
Опции темы

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