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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.92
robert19
26 / 26 / 3
Регистрация: 26.03.2010
Сообщений: 305
#1

Сортировка матрицы вставками и пузырьком - C++

20.09.2010, 09:30. Просмотров 3322. Ответов 17
Метки нет (Все метки)

Парни вот помоги немного)))
Вобщем задание такое:

Дана матрица, элементами которой являются латинские буквы. Отсортировать в лексикографическом порядке элементы каждого столбца:
а) Сортировкой вставками
б) Пузерьковой сортировкой

Примечания:
а) Программа должна запрашивать из файла двумерный массив. Результат сортировки по желанию пользователя может сохраняться в файл. Имя файла вводится с клавиатуры.
б) Массивы должны быть динамическими.

Сортировка вставками:

C++
1
2
3
4
5
6
for(a=1; a<count; a++){
    t=items[a];
    for(b=a-1; (b>=0)&&(t<items[b]); b--)
        items[b+1]=items[b];
        items[b+1]=t
}
Пузырьковая сортировка:

C++
1
2
3
4
5
6
7
8
9
for(int a=1; a<cout; a++){
    for(int b=cout-1; b>=a; b--){
        if(items[b-1]>items[b]){
            t=items[b-1];
            items[b-1]=items[b];
            items[b]=t;
        }
    }
}
Вот то, что я смог написать и то, что то касячит(((

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
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <limits>
#include <locale.h>
#include <iostream>
using namespace std;
 
int main() {
setlocale(LC_ALL,"Russian");
 
    int n=5,m=5;
    char** mass = new char *[n];
        for(int i=0; i<n; i++){
            mass[i] = new char [m];
        }
 
     char fn[255]; 
        FILE *f;
        cout <<"Введите имя файла:  ";
        cin >> fn;
        f=fopen(fn,"r");
                if (!f){
                        printf ("Error: Нет такого файла.\n");
                        f=stdin;
                }
        for (int i=0; i<n; i++) {
            for (int j=0; j<m; j++){
                fscanf(f,"%s" ,&mass[n][m]);
            }
        }
        fclose(f);
 
        for (int i=0; i<n; i++){
            for (int j=0; j<m; j++){
                cout << mass[n][m];
            }
        }
        
        for (int i=0; i<n; i++){
            delete [] mass[i];
        }
        delete [] mass;
        
 
        return 0;
}
Добавлено через 10 часов 59 минут
Никто не поможет(((

Добавлено через 1 час 40 минут
парни объясните хоть почему то, что я написал даже не работае. Щас проверял создавая одномерный динамический массив, все нормально, а вот с двумерным не хочит(((
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.09.2010, 09:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сортировка матрицы вставками и пузырьком (C++):

Сортировка пузырьком и вставками - C++
Помогите пожалуйста объединить две сортировки в одну программу Сортировка пузырьком #include &lt;iostream&gt; #include &lt;iomanip&gt; ...

Почему стандартная сортировка вектора std::sort намного быстрее сортировки вставками/пузырьком? - C++
Здравствуйте, объясните, пожалуйста, как реализована std::sort. Ясно, что через итераторы, но почему такой сильный выигрыш во времени (1.4...

Сортировка матрицы пузырьком - C++
Дано матрицу размерностью m на n, выглядеть должна так: | 4 | | 3 | | 6 | | 4 | Надо вывести матрицу, найти максимальное и...

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

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

Отсортировать массив по убыванию (вставками, пузырьком, выбором) - C++
Создайте массив из 10 случайных чисел (числа должны быть в диапазоне от 0 до 1000) и отсортируйте массив по убыванию при помощи...

17
dihlofos
Бродяга
303 / 257 / 17
Регистрация: 27.08.2010
Сообщений: 553
20.09.2010, 09:42 #2
Написали бы вы, какая конкретно ошибка вас не устраивает, стало бы проще...
Почему в цикле используете не счётчики (i,j) а размеры (n,m)? Как понимаю, читаете по символам, попробуйте:
fscanf(f,"%c" ,&mass[i][j]);
1
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
20.09.2010, 09:48 #3
C++
1
2
3
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++){
            fscanf(f, "%s", &mass[n][m]); /* n, m ? i, j */
как насчёт юзанья ifstream, чтобы можно было делать fin >> mass[i][j]

если читаешь по лексеме, то нельзя сразу сохранять в mass[i][j], так как %s сохраняет ещё и нуль-символ - на краях динамических массивов этот нуль-символ будет записываться за край отведённой памяти
нужно сначала принять в char tmp[2]; используя %1s и потом сделать mass[i][j] = tmp[0];

Добавлено через 1 минуту
то, что написал dihlofos, будет считывать ещё и пробелы, так как спецификатор %c считывает любой символ, даже перевод строки
1
dihlofos
Бродяга
303 / 257 / 17
Регистрация: 27.08.2010
Сообщений: 553
20.09.2010, 10:00 #4
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
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <limits>
#include <locale.h>
#include <iostream>
using namespace std;
 
int main()
{
    setlocale(LC_ALL,"Russian");
 
    int n=5,m=5, i,j,k;
    char sim, t;
    char** mass = new char *[n];
    for(int i=0; i<n; i++)
    {
      mass[i] = new char [m];
    }
 
    char fn[255];
    FILE *f;
 
    do
    {
        if(!f) cout<<"Error: Нет такого файла.\n";
        cout <<"Введите имя файла:  ";
        cin >> fn;
        f=fopen(fn,"r");
    }
    while (!f);
 
    ////// Чтение из файла в массив
    for (i=0; i<n; i++)
    {
        for (j=0; j<m; j++)
        {
            fscanf(f,"%c",&sim);
 
            if(sim==' '||sim=='\n')
                j--;
            else
                mass[i][j]=sim;
        }
    }
    fclose(f);
 
    ////// Вывод исходного
    cout<<"Исходный массив:"<<endl;
    for (i=0; i<n; i++)
    {
        for (j=0; j<m; j++)
            cout<<mass[i][j]<<'\t';
        cout<<endl;
    }
 
 
        // Сортировка пузырьком
    for(k=0; k<m; k++)
    {
       for(i=1; i<n; i++)
       {
          for(int j=n-1; j>=i; j--)
        {
           if(mass[j-1][k]>mass[j][k])
           {
             t=mass[j-1][k];
             mass[j-1][k]=mass[j][k];
             mass[j][k]=t;
           }
            }
       }
    }
 
        ////// Вывод отсортированного
    cout<<"Отсортированный массив:"<<endl;
        
    for (i=0; i<n; i++)
    {
        for (j=0; j<m; j++)
            cout<<mass[i][j]<<'\t';
        cout<<endl;
    }
 
 
    for (int i=0; i<n; i++)
    {
        delete [] mass[i];
    }
    delete [] mass;
 
    system("pause");
    return 0;
}
То что получилось методом пузырька. Сортирует в столбцах, если я правильно понял задание.
1
robert19
26 / 26 / 3
Регистрация: 26.03.2010
Сообщений: 305
20.09.2010, 10:20  [ТС] #5
Цитата Сообщение от dihlofos Посмотреть сообщение
Написали бы вы, какая конкретно ошибка вас не устраивает, стало бы проще...
Почему в цикле используете не счётчики (i,j) а размеры (n,m)? Как понимаю, читаете по символам, попробуйте:
fscanf(f,"%c" ,&mass[i][j]);
Да, на счет этой ошибки я допер сам)))) Просто как то не замечал
0
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
20.09.2010, 10:46 #6
C++
1
2
3
4
5
6
7
    for (j = 0; j < m; j++) {
        fscanf(f, "%c", &sim);
        if (sim == ' ' || sim == '\n')
            j--;
        else
            mass[i][j]=sim;
    }
ладно
0
robert19
26 / 26 / 3
Регистрация: 26.03.2010
Сообщений: 305
20.09.2010, 12:36  [ТС] #7
Цитата Сообщение от accept Посмотреть сообщение
C++
1
2
3
4
5
6
7
    for (j = 0; j < m; j++) {
        fscanf(f, "%c", &sim);
        if (sim == ' ' || sim == '\n')
            j--;
        else
            mass[i][j]=sim;
    }
ладно
У меня на эту функцию ругается вот такой вот ошибкой:
0
Миниатюры
Сортировка матрицы вставками и пузырьком  
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
20.09.2010, 12:45 #8
C++
1
2
3
4
5
6
7
8
9
10
#include <cstdio>
 
int main(void)
{
    char c;
 
    fscanf(stdin, "%c", &c);
 
    return 0;
}
вот попробуй
0
robert19
26 / 26 / 3
Регистрация: 26.03.2010
Сообщений: 305
20.09.2010, 12:51  [ТС] #9
Я писал вот так:
C++
1
2
3
4
5
for (int i=0; i<n; i++){
     for (int j=0; j<m; j++){
          fscanf(f,"%s",&mass[i][j]);
     }
}
И все бы ничего, если бы когда прога в консоли отработала и появилась строка "Для выхода нажмите любую клавишу..." Но у меня такая строка не вылазит. Приходится вручную закрывать, на крестик.
И ошибки то никакой не выдает...
0
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
20.09.2010, 12:56 #10
так ты заюзай код Дихлофоса

C++
1
2
    cout << "Press enter" << endl;
    cin.get();
0
robert19
26 / 26 / 3
Регистрация: 26.03.2010
Сообщений: 305
20.09.2010, 13:11  [ТС] #11
Вот посмотри, что получилось:
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
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <limits>
#include <locale.h>
#include <iostream>
using namespace std;
 
int main() {
    setlocale(LC_ALL,"Russian");
    
    int n=5,m=5;
    char sim;
    //Заводим динамический массив
    char** mass = new char *[n];
        for(int i=0; i<n; i++){
            mass[i] = new char [m];
        }
        //Обнуляем его
        for (int i=0; i<n; i++) {
            for (int j=0; j<m; j++){
                mass[i][j]=0;
            }
        }
 
        char fn[255]; //Переменная для ввода имени файла
        FILE *f;
        cout <<"Введите имя файла:  ";
        cin >> fn; 
        f=fopen(fn,"r");
                if (!f){  //Если не открылся то ошибка
                    cout << "Error: Нет такого файла.\n";
                    return 1;
                }
 
                //Чтение из файла в массив
        for (int i=0; i<n; i++){
            for (int j=0; j<m; j++){
                fscanf(f,"%s",&mass[i][j]);
            }
        }
        fclose(f);
        cout <<endl;
 
        //Распечатываем на косоль то, что прочитали из файла
        cout <<"Не сортированный массив:"<< endl;
        for (int i=0; i<n; i++){
            for (int j=0; j<m; j++){
                cout <<    mass[i][j]<<'\t';
            }
            cout<<endl;
        }
        cout<<endl;
 
        //Сортировка Пузырьком
        for(int k=0; k<m; k++){
           for(int i=1; i<n; i++){
              for(int j=n-1; j>=i; j--){
                   if(mass[j-1][k]>mass[j][k]){
                     char t;
                     t=mass[j-1][k];
                     mass[j-1][k]=mass[j][k];
                     mass[j][k]=t;
                   }
              }
           }
        }cout<<endl;
 
        //Распечатываем на косоль Отсортированный массив
        cout<<"Отсортированный массив (пузырьком):"<<endl;
        for (int i=0; i<n; i++){
            for (int j=0; j<m; j++)
                cout<<mass[i][j]<<'\t';
            cout<<endl;
        }cout<<endl;
 
        //Сортировка вставками
        char t; 
        for (int k=0; k<m; k++){
            for (int i=1; i<n; i++){
                t=mass[i][k];
                for (int j=i-1; (j>=0)&&(t<mass[j][k]); j--){
                    mass[j+1][k]=mass[j][k];
                mass[j+1][k]=t;
                }
            }
        }
 
        //Распечатываем на косоль Отсортированный массив
        cout<<"Отсортированный массив (вставками):"<<endl;
        for (int i=0; i<n; i++){
            for (int j=0; j<m; j++)
                cout<<mass[i][j]<<'\t';
            cout<<endl;
        }
 
        //Удаление динамического массива
        for (int i=0; i<n; i++){
            delete [] mass[i];
        }
        delete [] mass;
        cout << "Press enter" << endl;
        cin.get();
        return 0;
}
0
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
21.09.2010, 06:36 #12
C
1
fscanf(f,"%s",&mass[i][j]);
неправильно это, %s записывает два символа, она, допустим, читает один символ, а записывает два, читает два, а записывает три
и когда она доходит до края mass[0] - это выделенный кусок памяти, она пишет нуль-символ за край этой памяти, что и вызывает stack corrupted
0
dihlofos
Бродяга
303 / 257 / 17
Регистрация: 27.08.2010
Сообщений: 553
21.09.2010, 08:24 #13
У меня тем не менее никаких ошибок ваш код не выдаёт и всё делает правильно. Accept, объясните, что вообще произойдёт, если %s считает 2 символа и передаст их в mass[i][j], который может хранить только один символ? В mas[i][j+1] чтоли второй символ поместится или вообще потеряется? oO
0
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
21.09.2010, 12:43 #14
Цитата Сообщение от dihlofos
Accept, объясните, что вообще произойдёт, если %s считает 2 символа и передаст их в mass[i][j], который может хранить только один символ? В mas[i][j+1] чтоли второй символ поместится или вообще потеряется?
сначала fscanf() будет писать в j+1, перезатирая значения справа, а потом, когда дойдёт до последнего элемента в строке, запишет за край

C
1
2
3
4
    char tmp[2];
 
    if (fscanf(f, "%1s", tmp) == 1);
        mas[i][j] = tmp[0];
такая штука будет читать a b c d e, пропуская пробелы
2
robert19
26 / 26 / 3
Регистрация: 26.03.2010
Сообщений: 305
22.09.2010, 07:57  [ТС] #15
Спасибо ребят. Я уже все написал. Если кому надо эту прогу, могу выложить )))) Плюс разбил на функции и на файлы))) Ну и добавил многое другое))
0
22.09.2010, 07:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2010, 07:57
Привет! Вот еще темы с ответами:

Сортировка вектора по полю(Сортировка вставками) - C++
Здравствуйте! Нужно написать сортировку вектора по полю weight класса tomato. Вот класс: #pragma once #include &lt;iostream&gt; ...

Сортировка пузырьком - C++
#include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;ctime&gt; using namespace std; void Sort(int *, int); const int n = 8; int ...

Сортировка пузырьком - C++
Всем доброго времени суток. Помогите пожалуйста написать программу сортировки пузырьком в соответствии с данной блок-схемой.

Сортировка пузырьком - C++
Не удается сделать сортировку пузырьком (то что после //1111), не сортирует, либо ошибки в памяти. // spisok.cpp : Defines the entry...


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

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

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