С Новым годом! Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 09.07.2014
Сообщений: 4
1

Пузырьковая сортировка двумерного символьного массива

09.07.2014, 20:50. Показов 2537. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Передо мной была поставлена задача написать код, осуществляющий сортировку рандомно-сгенерированого символьного массива.
Сгенерировал нормально, а вот с сортировкой проблема.
Синтаксических ошибок не имеется, программа просто падает(Ну разумеется не просто а ввиду кривизны моих рук). Глубокими познаниями в C не располагаю, посему надеюсь, вы тыкнете меня носом, и обьясните что и как. Подозреваю, что накосячил с указателями, но вот где в толк не возьму, выглядит вроде все приемлемо...
В общем.. Вот код.
Кликните здесь для просмотра всего текста
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 <time.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
 
 
 
 bubblest(char **buff, int stc, int stsz)           //Проблемная функция
{
    int i, f;                                       //Счетчик, флажок
    char *buffer;                                   //Буфер для перемены двух строк местами
    buffer = (char*)malloc(stsz*sizeof(char*));     //Выделил память под буфер
 
do
{
    f=1;                                            //Флажок на ноль
    for(i=0;i<stc;++i)                              //поочередно перебираем строки
    {
        if (strcmp(*buff[i], *buff[i+1])!=0)        //Если они не равны(strcmp возвращает ноль при равенстве строк), то:
            if (strcmp(*buff[i], *buff[i+1])<0)     //Если i-я строка по алфавиту ниже (i+1)-й(strcmp возвращает -1) то
            {
                buffer=buff[i];                     //В буфер помещаем i-ую строку        <--------
                buff[i]=buff[i+1];                  //В i-ую строку помещаем (i+1)-ую строку    |
                buff[i+1]=buffer;                   //В (i+1)-ую помещаем то, что в буфере-------
                f=0;                                //Флаажок на ноль, т.к. перестановка совершена.
            }
    }
    
}
while(f==0);                                        //Условие цикла(Флаг на нуле => была совершена перестановка(ки))
}
 
/*void(char **buf, int stc)           <<<<<<< Здесь буду реализовывать вывод отсортированного, но до него еще дожить надо
{
    int i;
 
    
}*/ 
 
void testst(int stc, int stsz)                      //Ну собственно функция генерации массива, в ней все
                                                    //хорошо, т.к. Если закоментировать "проблемную" функцию сортировки, exeшник не падает
{
    int i, a, j, numberst=0;
    char *storage;
    char **buf;
    char alph[10]="asdfghjklp";                     
 
    storage = (char*)malloc(stsz*stc);               //выделяем память для массива 
    buf = (char**)malloc(stsz*sizeof(char*));        //массив указателей на строки матрицы
 
    for (i=0;i<stc;++i)
    {
        {
        for(j=0;j<stsz;++j)
            {   
            a=rand()%9;
            storage[j]=alph[a];
            }
        storage[j]='\0';
        buf[i]= storage;
        printf("%s",buf[i]);
        }
        
        numberst++;
    }
    printf("-------------------------------------");
    bubblest(buf, stc, stsz);
 
}
 
 
 
int main()
{
    srand(time(NULL));
    testst(10,80);
    getch();
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.07.2014, 20:50
Ответы с готовыми решениями:

Упорядочивание массива по возрастанию (пузырьковая сортировка)
Подскажите пожалуйста как упорядочить элементы одномерного массива,состоящего из N вещественных...

Построковая сортировка символьного массива
Доброго времени суток. Мне необходимо отсортировать слова в порядке, обратном алфавитному используя...

Сортировка символьного массива по строкам в порядке возрастания слов
Добрый вечер! Задали написать программу, удовлетворяющую следующему условию: &quot;Дан текст, по одному...

Пузырьковая сортировка двумерного массива
Задан 2-й массив. Требуется отсортировать каждую строку по убыванию.Сортировка пузырьковая должна...

9
Модератор
Эксперт функциональных языков программированияЭксперт Python
37344 / 20776 / 4276
Регистрация: 12.02.2012
Сообщений: 34,187
Записей в блоге: 14
09.07.2014, 21:47 2
C массивами строк так:

C
1
2
3
 buffer=buff[i];                    
 buff[i]=buff[i+1];
 buff[i+1]=buffer;
так работать нельзя. Нужно так:

C
1
2
3
 strcpy(buffer,buff[i]);                    
 strcpy(buff[i],buff[i+1]);
 strcpy(buff[i+1],buffer);
Добавлено через 1 минуту
И, мне кажется, что строка 20 просто лишняя. Обрати еще внимание на размеры массива buffer. Я бы увеличил размер на 1 (на нуль-символ).
1
430 / 384 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
09.07.2014, 22:07 3
Три вопроса:
1. Принципиально использовать свою функцию сортировки?
2. Принципиально использовать именно пузырьковую сортировку?
3. Как понять двумерную сортировку? Подразумевается, что каждая строка должна быть отсортирована, а потом строки отсортированы друг относительно друга? Или массив можно рассматривать как одну строку?
Возьмем тривиальный случай, массив 2х2. Вот такой:
Y B
Z A

В первом случае мы отсортируем сначала каждую строку
B Y
A Z

А потом переставим строки и получим
A Z
B Y

Это если сортировать сначала внутри строк, потом сами строки. Если рассматривать массив как строку, получаем
A B
Y Z

То есть мы как бы отсортировали строку "YBZA" в "ABYZ". Так какой метод правильный? Или какой-то третий?
0
0 / 0 / 0
Регистрация: 09.07.2014
Сообщений: 4
10.07.2014, 01:30  [ТС] 4
1. Да
2. Нет, просто мне она видится самой простой в её реализации
3. Двумерный символьный массив, т.е. массив из строк. Сортируем строки между собой в алфавитном порядке, внутри строк изменений не должно происходить.

Добавлено через 52 секунды
Код, поменял, и насчет двадцатой строки это да... понесло меня не спорю)

Добавлено через 1 минуту
Нашел почему программа падала. Но сейчас кое-какие другие проблемы. Когда разберусь - отпишусь, если интересно)

Добавлено через 18 минут
В общем не могу понять что происходит, программа работает, но работает неправильно. В результате сортировки она каким-то образом заполняет все строки массива тем, что расположено в последней его строчке изначально. Замена строк через буфер вроде верно... С флажками и условиями тоже все правильно....

Вот исправленный исходник, может вы найдете, где я ошибся..:
Кликните здесь для просмотра всего текста
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
#include <stdio.h>
#include <time.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
 
 
 
 bubblest(char **buff, int stc, int stsz)           //Проблемная функция
{
    int i, f;                                       //Счетчик, флажок
    char *buffer= (char*)malloc(stsz);      //Выделил память под буфер
 
do
{
    f=1;                                            //Флажок на ноль
    for(i=0;i<stc-1;++i)                            //поочередно перебираем строки
    {
            if (strcmp(buff[i], buff[i+1])<0)       
        
            {
                strcpy(buffer, buff[i]);                    
                strcpy(buff[i],buff[i+1]);
                strcpy(buff[i+1],buffer);                   
                f=0;                                //Флажок на ноль, т.к. перестановка совершена.
            }
            printf("s\n");
    }
 
    
}
 
while(f==0);                                        //Условие цикла(Флаг на нуле => была совершена перестановка(ки))
 
 
for (i=0;i<stc;++i)
        printf("%s",buff[i]);
 
}
 
/* printresult(char **buf, int stc)          
{
    int i;
 
    for (i=0;i<stc;++i)
        printf("%s",buf[i]);
    
    
}*/ 
 
void testst(int stc, int stsz)                      
                                                    
{
    int i, a, j, numberst=0;
    char *storage;
    char **buf;
    char alph[10]="asdfghjklp";                     
 
    storage = (char*)malloc(stsz*stc);               //выделяем память для массива 
    buf = (char**)malloc(stsz*sizeof(char*));        //массив указателей на строки матрицы
 
    for (i=0;i<stc;++i)
    {
        {
        for(j=0;j<stsz;++j)
            {   
            a=rand()%9;
            storage[j]=alph[a];
            }
        storage[j]='\0';
        buf[i]= storage;
        printf("%s",buf[i]);
        }
        
        numberst++;
    }
    printf("-------------------------------------\n");
    bubblest(buf, stc, stsz);
 
}
 
 
 
int main()
{
    srand(time(NULL));
    testst(10,80);
    getch();
    return 0;
}


Добавлено через 3 минуты
C
1
printf("%s",buff[i]);
- чтобы проверить сколько раз цикл do while проходится по массиву(Проходится он 9 раз, пока не сделает первые 9 строк копиями десятой. Все идеи по поводу того, что может быть причиной себя исчерпали. Надеюсь на вас.)
0
430 / 384 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
10.07.2014, 08:55 5
Цитата Сообщение от G0T0 Посмотреть сообщение
1. Да
Ну ладно.

Цитата Сообщение от G0T0 Посмотреть сообщение
2. Нет, просто мне она видится самой простой в её реализации
Мне больше нравится гномья сортировка. По сути, это разновидность пузырьковой, но короче и проще писать.

Цитата Сообщение от G0T0 Посмотреть сообщение
3. Двумерный символьный массив, т.е. массив из строк. Сортируем строки между собой в алфавитном порядке, внутри строк изменений не должно происходить.
Я просмотрел код по диагонали и увидел там какие-то перемещения символов. Вы что, сортируете строки их тупым копированием с одного места на другое? Охосспадя... Это ужос-ужос-ужос. Дедушко, забери меня отсюда.
0
0 / 0 / 0
Регистрация: 09.07.2014
Сообщений: 4
10.07.2014, 09:20  [ТС] 6
Конкретики побольше, ато даже как-то не очень тупым себя почувствовал..
0
430 / 384 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
10.07.2014, 12:07 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
#include <stdlib.h>     // rand, srand
#include <time.h>       // time
 
#define N_STRINGS 10
#define MAX_LENGTH 50
#define BUF_SIZE (MAX_LENGTH+1)
 
char strings[N_STRINGS][BUF_SIZE];
 
char random_char(void)
{
    const char alphabet[] = "asdfghjklp";
    return alphabet[rand() % (sizeof(alphabet) - 1)];
}
 
void fill_string(char* str, size_t len)
{
    while( len-- ) {
        *str++ = random_char();
    }
    *str = '\0';
}
 
void sort_storage(char* storage[], size_t n_strings)
{
    size_t i = 1;
    size_t j = 2;
    while( i < n_strings ) {
        if( strcmp(storage[i], storage[i - 1]) != -1 ) {
            i = j++;
        } else {
            char* t = storage[i];
            storage[i] = storage[--i];
            storage[i] = t;
            if( i == 0 ) {
                i = j++;
            }
        }
    }
}
 
void print_storage(char* storage[], size_t n_strings)
{
    for( size_t i = 0; i < n_strings; ++i ) {
        puts(storage[i]);
    }
}
 
int main(void)
{
    srand(time(NULL));
 
    char* storage[N_STRINGS];
 
    int i;
    for( i = 0; i < N_STRINGS; ++i ) {
        fill_string(strings[i], MAX_LENGTH);
        storage[i] = strings[i];
    }
    print_storage(storage, sizeof(storage)/sizeof(storage[0]));
    putchar('\n');
    sort_storage(storage, sizeof(storage)/sizeof(storage[0]));
    print_storage(storage, sizeof(storage)/sizeof(storage[0]));
 
    return 0;
}
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
10.07.2014, 13:08 8
Цитата Сообщение от G0T0 Посмотреть сообщение
Конкретики побольше, ...
Цитата Сообщение от G0T0 Посмотреть сообщение
C++
1
2
3
strcpy(buffer, buff[i]); 
 strcpy(buff[i],buff[i+1]);
 strcpy(buff[i+1],buffer);
Если размер строки N (например, 400 элементов), то потребуется копировать 3N байт ( 3*400 == 1200 байт ).
Цитата Сообщение от Vtulhu Посмотреть сообщение
C++
1
2
3
char* t = storage[i];
 storage[i] = storage[--i];
 storage[i] = t;
В коде Vtulhu копируются указатели. Если размер указателя 4 байта, то копируется 12 байт. Независимо от размер строки.
1
Почетный модератор
Эксперт С++
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
10.07.2014, 13:57 9
Cортировка пузырьком в динамическом двумерном массиве
0
0 / 0 / 0
Регистрация: 09.07.2014
Сообщений: 4
12.07.2014, 12:41  [ТС] 10
Ох уж эти указатели, не совсем понимаю их... Ну ладно, теперь в полной мере осознал глупость того, что делал, исправлю)
0
12.07.2014, 12:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.07.2014, 12:41
Помогаю со студенческими работами здесь

Пузырьковая сортировка двумерного массива
Как-то подзабыл сортировку двумерного массива. Попросили нарисовать в примитивном виде. Посмотрел...

Сортировка вставками двумерного символьного массива
Есть двумерный символьный массив, , содержащий в себе строки с личными данными (условно, ФИО)....

Сортировка двумерного символьного массива по алфавиту
Здравствуйте, надо отсортировать список людей по первой букве в алфавитном порядке. Не могу найти у...

Заполнение двумерного символьного массива
Задача №2 Дано нечетное число n, не превосходящее 15. Создайте двумерный массив из n×n...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru