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

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

Восстановить пароль Регистрация
 
dioxyde
0 / 0 / 0
Регистрация: 06.01.2012
Сообщений: 7
30.06.2012, 16:56     Сортировка двумерного массива char #1
Помогите пожалуйста отсортировать двумерный массив(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]
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zitxbit
Master C/C++
 Аватар для zitxbit
86 / 738 / 75
Регистрация: 11.04.2012
Сообщений: 971
30.06.2012, 18:08     Сортировка двумерного массива char #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/02593a...3f38fbef6fa33a
zitxbit
Master C/C++
 Аватар для zitxbit
86 / 738 / 75
Регистрация: 11.04.2012
Сообщений: 971
30.06.2012, 18:15     Сортировка двумерного массива char #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/622c92...cd65a248841acc
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
30.06.2012, 18:19     Сортировка двумерного массива char #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;
}
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
30.06.2012, 18:21     Сортировка двумерного массива char #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");
}
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4923 / 2666 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
30.06.2012, 19:35     Сортировка двумерного массива char #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;
}
-=ЮрА=-
Заблокирован
Автор FAQ
01.07.2012, 09:53     Сортировка двумерного массива char #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
Миниатюры
Сортировка двумерного массива char  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2012, 17:21     Сортировка двумерного массива char
Еще ссылки по теме:

Ошибка при динамическом выделении двумерного массива char C++
Заполнение двумерного массива char-ов одним символом C++
C++ В чем отличие двумерного массива типа char от массива указателей на char?

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
01.07.2012, 17:21     Сортировка двумерного массива char #8
dioxyde, а что такое двумерный массив чаров? Одномерный знаю. Сёвая строка. А двумерный? Сёвый текст что ли?
Yandex
Объявления
01.07.2012, 17:21     Сортировка двумерного массива char
Ответ Создать тему
Опции темы

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