Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 06.01.2012
Сообщений: 7
1

Сортировка двумерного массива char

30.06.2012, 16:56. Просмотров 2237. Ответов 7
Метки нет (Все метки)

Помогите пожалуйста отсортировать двумерный массив(2d) символов(char) по возрастанию..

Пишу программу на с++ в Visual Studio 2005;

дело вот в чём - есть двумерный массив символов состоящих из строк содержащих как цифры так и буквы.
Сдесь представлены пределы номеров кредитных карт и названия карт. Номер состоит из 16 символов затем следует разделитель и второй предел карты,далее название.Пример:

4000000000000000;4599999999999999;VISA
4600000000000000;4799999999999999;Visa Electron
9428000000000000;9428999999999999;Local CARD
6700000000000000;6799999999999999;MAESTRO
5000000000000000;5999999999999999;MASTERCARD
3000000000000000;3999999999999999;AMEX

в таком порядке данные записываются в двумерный массив char
Но как сделать так, чтобы строки в массиве были упорядочены по возрастанию?
Причём сортировка должна роводится по первому пределу номера карты, тоесть по первым 16 цифрам. Пример:

3000000000000000;3999999999999999;AMEX
4000000000000000;4599999999999999;VISA
4600000000000000;4799999999999999;Visa Electron
5000000000000000;5999999999999999;MASTERCARD
6700000000000000;6799999999999999;MAESTRO
9428000000000000;9428999999999999;Local CARD

Имеется ввиду чтобы, к примеру карта AMEX до сортировки была array[5][i], а после стала array[0][i]
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.06.2012, 16:56
Ответы с готовыми решениями:

В чем отличие двумерного массива типа char от массива указателей на char?
В чем отличие двумерного массива типа char и массива указателей на char ?

Инициализация двумерного массива char-ов
как можно инициализировать и реализовать двумерный массив чаров в heder и cpp соответстенно

Заполнение двумерного массива char-ов одним символом
Нужно чтобы весь массив был забит одним символом (например Н) Код: #include <iostream> using...

Ввод двумерного массива символов char с клавиатуры
к примеру нужно ввести массив размером 4х2 : a f b d c e g h как это можно реализовать в...

7
95 / 747 / 279
Регистрация: 11.04.2012
Сообщений: 971
30.06.2012, 18:08 2
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
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
 
#define N 256
 
void swaps(char* str1, char* str2);
bool iseqkey(char* str1, char* str2, int n, int k);
 
int main()
{
    static char ppsz[7][256] = { "4000000000000000;4599999999999999;VISA", 
                                 "4600000000000000;4799999999999999;Visa Electron", 
                                 "9428000000000000;9428999999999999;Local CARD", 
                                 "6700000000000000;6799999999999999;MAESTRO", 
                                 "5000000000000000;5999999999999999;MASTERCARD", 
                                 "3000000000000000;3999999999999999;AMEX",
                                 ""};
 
    int k = strlen(ppsz[0])-1;
    while (ppsz[0][k] != ';') k--;
    for (int q = k+1; q < 256; q++)
        for (int w = 0; strcmp("\0",ppsz[w]) < 0; w++)
        {
            int min = w;
            for (int v = w+1; strcmp("\0",ppsz[v]) < 0; v++)
                min = (tolower(ppsz[v][q]) < tolower(ppsz[min][q])) ? v : min;
            if (iseqkey(ppsz[w], ppsz[min], q-1, k+1))
                swaps((char*)ppsz[w], (char*)ppsz[min]);
        }
 
    for (int t = 0; strcmp("\0",ppsz[t]) < 0; t++)
        printf("%s\n",ppsz[t]);
 
    printf("\n\n");
 
    _getch();
 
    return 0;
}
 
void swaps(char* str1, char* str2)
 { char temp[256] = "\0"; strcpy(temp, str1);
    strcpy(str1,str2); strcpy(str2,temp); }
 
bool iseqkey(char* str1, char* str2, int n, int k)
{
    for (int i = n; i >= k; i--)
        if (tolower(str1[i]) != tolower(str2[i])) 
            return false;
    return true;
}
http://liveworkspace.org/code/... fbef6fa33a
2
95 / 747 / 279
Регистрация: 11.04.2012
Сообщений: 971
30.06.2012, 18:15 3
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
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
 
#define N 256
 
void swaps(char* str1, char* str2);
bool iseqkey(char* str1, char* str2, int n, int k);
 
int main()
{
    static char ppsz[7][256] = { "4000000000000000;4599999999999999;VISA", 
                                 "4600000000000000;4799999999999999;Visa Electron", 
                                 "9428000000000000;9428999999999999;Local CARD", 
                                 "6700000000000000;6799999999999999;MAESTRO", 
                                 "5000000000000000;5999999999999999;MASTERCARD", 
                                 "3000000000000000;3999999999999999;AMEX",
                                 ""};
 
    int k = strlen(ppsz[0])-1;
    while (ppsz[0][k] != ';') k--;
    for (int q = k+1; q < 256; q++)
        for (int w = 0; strcmp("\0",ppsz[w]) < 0; w++)
        {
            int min = w;
            for (int v = w+1; strcmp("\0",ppsz[v]) < 0; v++)
                min = (tolower(ppsz[v][q]) < tolower(ppsz[min][q])) ? v : min;
            if (iseqkey(ppsz[w], ppsz[min], q-1, k+1))
                swaps((char*)ppsz[w], (char*)ppsz[min]);
        }
 
    for (int t = 0; strcmp("\0",ppsz[t]) < 0; t++)
        printf("%s\n",ppsz[t]);
 
    printf("\n\n");
 
    _getch();
 
    return 0;
}
 
void swaps(char* str1, char* str2)
 { char temp[256] = "\0"; strcpy(temp, str1);
    strcpy(str1,str2); strcpy(str2,temp); }
 
bool iseqkey(char* str1, char* str2, int n, int k)
{
    for (int i = n; i >= k; i--)
        if (tolower(str1[i]) != tolower(str2[i])) 
            return false;
    return true;
}
http://liveworkspace.org/code/... a248841acc
1
2551 / 1316 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
30.06.2012, 18:19 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
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
 
int main()
{
    std::vector
    <
        std::string
    >   v
        ({
            "4000000000000000;4599999999999999;VISA",
            "4600000000000000;4799999999999999;Visa Electron",
            "9428000000000000;9428999999999999;Local CARD",
            "6700000000000000;6799999999999999;MAESTRO",
            "5000000000000000;5999999999999999;MASTERCARD",
            "3000000000000000;3999999999999999;AMEX",
        });
    std::sort(v.begin(), v.end());
    for(const auto& elem: v)
        std::cout << elem << std::endl;
    return 0;
}
1
869 / 767 / 174
Регистрация: 11.01.2012
Сообщений: 1,942
30.06.2012, 18:21 5
zitxbit,
Все проще
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
#include <iostream>
#include <cstring>
 
int main()
{
    size_t i, j;
 char tmp[100], str[6][100] = {
                               {"4000000000000000;4599999999999999;VISA"},
                               {"4600000000000000;4799999999999999;Visa Electron"},
                               {"9428000000000000;9428999999999999;Local CARD"},
                               {"6700000000000000;6799999999999999;MAESTRO"},
                               {"5000000000000000;5999999999999999;MASTERCARD"},
                               {"3000000000000000;3999999999999999;AMEX"}
                               };
        for(j = 0; j < 6; j++)
                   std::cout  <<  str[j] << std::endl;
 
 
        for(j = 1; j < 6; j++)
           for (i = 0; i < 6 - j; i++)
             {
                 if(strcmp(str[i + 1] , str[i]) < 0 )
                      {
 
                      strcpy(tmp , str[i] );
                      strcpy(str[i], str[i + 1] );
                      strcpy( str[i + 1], tmp);
 
                      }
            }
            std::cout  <<  std::endl;
 
        for(j = 0; j < 6; j++)
                std::cout  <<  str[j] << std::endl;
        system("pause");
}
1
Форумчанин
Эксперт CЭксперт С++
8160 / 5008 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
30.06.2012, 19:35 6
Еще проще
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <set>
#include <string>
 
int main()
{
    std::set < std::string > v
        {
            "4000000000000000;4599999999999999;VISA",
            "4600000000000000;4799999999999999;Visa Electron",
            "9428000000000000;9428999999999999;Local CARD",
            "6700000000000000;6799999999999999;MAESTRO",
            "5000000000000000;5999999999999999;MASTERCARD",
            "3000000000000000;3999999999999999;AMEX",
        };
    for(const auto& elem: v)
        std::cout << elem << std::endl;
    return 0;
}
1
Заблокирован
Автор FAQ
01.07.2012, 09:53 7
Цитата Сообщение от dioxyde Посмотреть сообщение
Помогите пожалуйста отсортировать двумерный массив(2d) символов(char) по возрастанию..
Пишу программу на с++ в Visual Studio 2005;
дело вот в чём - есть двумерный массив символов состоящих из строк содержащих как цифры так и буквы.
Сдесь представлены пределы номеров кредитных карт и названия карт. Номер состоит из 16 символов затем следует разделитель и второй предел карты,далее название.Пример:
4000000000000000;4599999999999999;VISA
4600000000000000;4799999999999999;Visa Electron
9428000000000000;9428999999999999;Local CARD
6700000000000000;6799999999999999;MAESTRO
5000000000000000;5999999999999999;MASTERCARD
3000000000000000;3999999999999999;AMEX
в таком порядке данные записываются в двумерный массив char
Но как сделать так, чтобы строки в массиве были упорядочены по возрастанию?
Причём сортировка должна роводится по первому пределу номера карты, тоесть по первым 16 цифрам. Пример:
3000000000000000;3999999999999999;AMEX
4000000000000000;4599999999999999;VISA
4600000000000000;4799999999999999;Visa Electron
5000000000000000;5999999999999999;MASTERCARD
6700000000000000;6799999999999999;MAESTRO
9428000000000000;9428999999999999;Local CARD
Имеется ввиду чтобы, к примеру карта AMEX до сортировки была array[5][i], а после стала array[0][i]
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 <string>
#include <iomanip>
#include <fstream>
#include <iostream>
using namespace std;
 
struct CARD
{
    double beg;
    double end;
    char name[32];
};
 
//Ôóíêöèÿ âîçðàòèò ÷èñëî ñòðîê â ôàéëå
//ôëàã bUpdateData îòâå÷àåò çà èíèöèàëèçàöèþ ìàññèâà CARD * pList
//â çàâèñèìîñòè îò åãî çíà÷åíèÿ ôóíêöèÿ ñ÷èòàåò äàííûå ôàéëà ìàññèâ 
//pList (bUpdateData == ÈÑÒÈÍÀ)
int getLinesInFile(ifstream &ifs, CARD * pList, bool bUpdateData);
//Ôóíêöèÿ îáìåíèâàåò ñîäåðæèìîå ïîëåé ñòðóêòóð CARD pLeft, pRight
void swapCARDS(CARD &pLeft, CARD &pRight);
 
int main()
{
    int i,j, nCards = 0;
    CARD * pList    = NULL;
    ifstream ifs("cards.txt");
    if(!ifs.is_open())
        cout<<"Error open cards.txt\n";
    else
    {
        //Ïîëó÷àåì ÷èñëî ñòðîê (÷èñëî çàïèñåé î êàðòàõ) èç ôàéëà
        nCards = getLinesInFile(ifs, pList, false);
        if(nCards < 1)
            cout<<"cards.txt not contain card data\n";
        else
        {
            //Âûäåëÿåì ïàìÿòü ïîä ìàññèâ ñòðóêòóð ñîäåðæàùèìè ñâåäåíèÿ î êàðòå
            pList  = new CARD[nCards];
            //Ñ÷èòûâàåì äàííûå èç ôàéëà
            nCards = getLinesInFile(ifs, pList, true);
            ifs.close();//Çàêðûâàåì ïîòîê ÷òåíèÿ
            cout<<"\tCARDS DATA FROM FILE\n";
            for(i = 0    ; i < nCards; i++)
                cout<<setprecision(16)<<pList[i].beg<<";"
                    <<setprecision(16)<<pList[i].end<<";"
                    <<pList[i].name<<endl;
            for(i = 0    ; i < nCards; i++)
            for(j = i + 1; j < nCards; j++)
            {
                if(pList[j].beg < pList[i].beg)
                    swapCARDS(pList[j],pList[i]);
            }
            cout<<"\tSORTED CARDS DATA\n";
            for(i = 0    ; i < nCards; i++)
                cout<<pList[i].beg<<";"
                    <<pList[i].end<<";"
                    <<pList[i].name<<endl;
            delete [] pList;//×èñòèì ïàìÿòü
        }
    }
    system("pause");
    return 0;
}
 
int getLinesInFile(ifstream &ifs, CARD * pList, bool bUpdateData)
{
    int nLines = 0;
    string line;
    ifs.seekg(0,ios::beg);
    while(getline(ifs,line))
    {
        if(bUpdateData)//Åñëè bUpdateData == ÈÑÒÈÍÀ
            sscanf
            (
                line.c_str(),
                "%lf;%lf;%s",
                &pList[nLines].beg,
                &pList[nLines].end,
                pList[nLines].name
            );//×èòàåì ïîëÿ ñòðóêòóðû èç ñòðîêè line
        nLines = nLines + 1;
    }
    ifs.clear();//Ñáðàñûâàåì ôëàã EOF
    ifs.seekg(0,ios::beg);//Âîçâðàùàåì êóðñîð âíà÷àëî ôàéëà
    return nLines;
}
 
void swapCARDS(CARD &pLeft, CARD &pRight)
{
    //ïðîñòîé îáìåí ÷åðåç áóôåðíóþ ñòðóêòóðó
    CARD pBuf = pLeft;
    pLeft  = pRight;
    pRight = pBuf;
}
cards.txt
4000000000000000;4599999999999999;VISA
4600000000000000;4799999999999999;Visa Electron
9428000000000000;9428999999999999;Local CARD
6700000000000000;6799999999999999;MAESTRO
5000000000000000;5999999999999999;MASTERCARD
3000000000000000;3999999999999999;AMEX
1
Миниатюры
Сортировка двумерного массива char  
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
01.07.2012, 17:21 8
dioxyde, а что такое двумерный массив чаров? Одномерный знаю. Сёвая строка. А двумерный? Сёвый текст что ли?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.07.2012, 17:21

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Изменение двумерного массива элементов типа char
Доброго дня суток всем. Прошу помочь с одной задачей. Нужно ввести с клавиатуры целое число и текст...

Ошибка при динамическом выделении двумерного массива char
Ребята, спасите-помогите. Нужно выделить двумерный массив типа char для игрового поля. Выделяю...

Вывод двумерного статически создаваемого массива символов (char) в cout
Приветствую всех. Подскажите пожалуйста как вывести через cout в терминал двумерный, статически...

Передача двумерного массива указателей на char в качестве параметра функции
Есть массив char *result2; Нужно передать его в функцию void defDouble(???) в качестве одного из...


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

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

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