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

Cортировка символьного двумерного массива по алфавиту - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.83
Luna17
 Аватар для Luna17
3 / 3 / 1
Регистрация: 09.03.2010
Сообщений: 95
09.03.2010, 01:02     Cортировка символьного двумерного массива по алфавиту #1
// сtroku.cpp: определяет точку входа для консольного приложения.
//
Задание: вести с клавиатуры список фамилий ( в каждой строке по 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
#include "stdafx.h"
#include "string.h"
#include "stdio.h"
#include "locale.h"
 
int _tmain(int argc, _TCHAR* argv[])
{    
    setlocale (LC_ALL, "Russian");
     const  int k=4;
     int  i ;
     char mas[k][20], n[20] ;
     for (i=0; i<k; i++)
     {
     printf ("Введите фамилию mas[%d][20]=", i);
     scanf("%d", mas[k][20]);
     }
     printf ("\n");
     for (i=0; i<k; i++)
         gets (mas[i][20]);
     
     if (strcmp(mas[i][20], mas[i+1][20]>0)
             strcpy (n[20], mas[i+1][20]);
             strcpy (mas[i][20], mas[i+1][20]);
             strcpy (mas[i+1][20], n[20]);
        
     printf ("список фамилий отсортирован по алфавиту:");
     printf ("\n");
    
      return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.03.2010, 01:02     Cортировка символьного двумерного массива по алфавиту
Посмотрите здесь:

Cортировка массива. C++
Cортировка массива. C++
Cортировка массива C++
Заполнение массива значениями из символьного массива C++
C++ Размер символьного массива
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
09.03.2010, 04:18     Cортировка символьного двумерного массива по алфавиту #2
  1. В 21 строчке забыла ")" перед ">0"
  2. Строки 14-24: ты здесь работаешь не со строкой, как нужно, а с отдельным символом, причем выходишь за границы массива (mas[i][20], тогда как второй индекс может принимать значения от 0 до 19). Здесь вместо отдельного символа нужно задавать строку mas[i], например
    C++
    1
    
    strcmp(mas[i], mas[i+1])
  3. Строки 22-24, надо поместить в фигурные скобки
  4. Вообще у тебя напутано с циклами for. Вот рабочий код:
    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
    
    #include <iostream>
    #include <string>
     
    int main()
    {
        setlocale (LC_ALL, "Russian");
            const  int k=4;
            char mas[k][20], n[20];
        for (size_t i=0; i<k; i++)
        {
            std::cout << "Введите mas[" << i << "]: ";
            std::cin >> mas[i];
        }
            for(size_t i=0; i<k-1; ++i)  
            if (strcmp(mas[i], mas[i+1])>0)
            {
                strcpy (n, mas[i+1]);
                strcpy (mas[i], mas[i+1]);
                strcpy (mas[i+1], n);
            }
     
        std::cout << "Отсортированный массив" << std::endl;
     
        for(size_t i=0; i<k; ++i, std::cout << std::endl)
            std::cout << mas[i];
        system("pause");
        return EXIT_SUCCESS;
    }
  5. Кстати, setlocale() позволит тебе, конечно, вывести строки в кириллице, но если ты попробуешь ввести русские буквы в строку, то при выводе этой строки будет не русский текст, а "кракозябры" (это справедливо, конечно, если ты в винде работаешь)
  6. Вот пример с использование контейнеров и алгоритмов STL:
    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
    
    #include <iostream>
    #include <vector>
    #include <string>
    #include <algorithm>
    #include <iterator>
    #include <functional>
     
    int main()
    {
        setlocale (LC_ALL, "Russian");
        std::vector<std::string> v;
        std::string temp;
        //Ввод продолжается до тех пор, пока не нажмешь "Ctrl+Z", потом "Enter"
        while(std::getline(std::cin, temp))
            v.push_back(temp);
     
        //Сортировка в алфавитном порядке
        std::cout << "Сортировка в алфавитном порядке:" << std::endl;
        std::sort(v.begin(), v.end());
        //Вывод отсортированного массива
        std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
        std::cout << std::endl;
        //Сортировка в обратном порядке
        std::cout << "Сортировка в обратном порядке:" << std::endl;
        std::sort(v.begin(), v.end(), std::greater<std::string>());
        //Вывод отсортированного массива
        std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
        system("pause");
        return EXIT_SUCCESS;
    }
Luna17
 Аватар для Luna17
3 / 3 / 1
Регистрация: 09.03.2010
Сообщений: 95
09.03.2010, 08:51  [ТС]     Cортировка символьного двумерного массива по алфавиту #3
у ми по твоей проге выдает 22 ошибки, не знаю почему,
я попробовала на основе того что ты дал поредоктировать первоначальный вариант, там одна ошибка мож посмотреть?

ошибка С2296: недопустимо, левый операнд имеет тип "const char [21]"

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
// сtroku.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include "string.h"
#include "stdio.h"
#include "locale.h"
 
int _tmain(int argc, _TCHAR* argv[])
{    
    setlocale (LC_ALL, "Russian");
     const  int k=4;
     int  i ;
     char mas[k][20], n[20] ;
     for (i=0; i<k; i++)
     {
     printf ("Введите фамилию mas[" << i << "]:");
     scanf("%d", mas[i]);
     }
     for (i=0; i<(k-1); i++)
        if (strcmp(mas[i], mas[i+1])>0)
        {
             strcpy (n, mas[i+1]);
             strcpy (mas[i], mas[i+1]);
             strcpy (mas[i+1], n);
        }  
     printf ("%s","список фамилий отсортирован по алфавиту:");
     for (i=0; i<(k-1); i++)
      puts(mas[i]);
      return 0;
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
09.03.2010, 09:09     Cортировка символьного двумерного массива по алфавиту #4
Luna17, программа, которую Вам написал Nameless One, прекрасно работает, но только если в ней ничего не менять...
Cортировка символьного двумерного массива по алфавиту
А вот у Вас - мало того, что программа на С написана, так ещё и с ошибками...
Например:
Цитата Сообщение от Luna17 Посмотреть сообщение
C++
1
2
3
4
5
6
7
...
char mas[k][20], n[20] ; 
for (i=0; i<k; i++) 
{ printf ("Введите фамилию mas[" << i << "]:"); 
  scanf("%d", mas[i]); // прочитать целое число и занести его в массив строк?
}
...
Может Вам именно на С и надо?
Luna17
 Аватар для Luna17
3 / 3 / 1
Регистрация: 09.03.2010
Сообщений: 95
09.03.2010, 09:26  [ТС]     Cортировка символьного двумерного массива по алфавиту #5
мне нужна прога на С++. точнее назв проги Visual C++
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
09.03.2010, 09:27     Cортировка символьного двумерного массива по алфавиту #6
17-18 строки ошибка (не надо пробовать совмещать потоки С++ и функции вывода С), в форматной строке нужно указывать правильный спецификатор
C++
1
2
printf ("Введите фамилию mas%d\t", i);
         scanf("%s", mas[i]);
В 27 строке спецификатор типа не имеет смысла.
28 строка - неправильно задан цикл, надо так
C++
1
for (i=0; i<k; i++)
И да - Ваш алгоритм сортировки, как и мой первый вариант решения, неверен, так как в результате прохода по массиву строк будут меняться местами только соседние строки (зато второй работает)
Luna17
 Аватар для Luna17
3 / 3 / 1
Регистрация: 09.03.2010
Сообщений: 95
09.03.2010, 09:27  [ТС]     Cортировка символьного двумерного массива по алфавиту #7
Уменя ввод элементов, проходит нормально, а выводит комп какие то непонятные символы
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
09.03.2010, 09:30     Cортировка символьного двумерного массива по алфавиту #8
Цитата Сообщение от Luna17 Посмотреть сообщение
мне нужна прога на С++.
Мой второй вариант - как раз на С++.
И для Visual Studio, кстати, работает

Добавлено через 1 минуту
Цитата Сообщение от Luna17 Посмотреть сообщение
Уменя ввод элементов, проходит нормально, а выводит комп какие то непонятные символы
Вводи только символы латинского алфавита, не кириллицу:

Цитата Сообщение от Nameless One Посмотреть сообщение
Кстати, setlocale() позволит тебе, конечно, вывести строки в кириллице, но если ты попробуешь ввести русские буквы в строку, то при выводе этой строки будет не русский текст, а "кракозябры" (это справедливо, конечно, если ты в винде работаешь)
Luna17
 Аватар для Luna17
3 / 3 / 1
Регистрация: 09.03.2010
Сообщений: 95
09.03.2010, 09:33  [ТС]     Cортировка символьного двумерного массива по алфавиту #9
у меня в сортировке когда выводится список что то непонятное выводит, а при
Введите фамилию mas -858993460 можно ли избежать того что бы печаталось mas -858993460

Добавлено через 57 секунд
Цитата Сообщение от Nameless One Посмотреть сообщение
Мой второй вариант - как раз на С++.
И для Visual Studio, кстати, работает

Добавлено через 1 минуту

Вводи только символы латинского алфавита, не кириллицу:
А можно что нить сделать что бы русские буквы были?
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
09.03.2010, 09:43     Cортировка символьного двумерного массива по алфавиту #10
Можно
В начале программы впиши
C++
1
#include <windows.h>
В начале функции main впиши строки
C++
1
2
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
Открой свойства консоли и во вкладке "Шрифт" выбери Lucida Console (вообще про руссификацию консоли написано тут)

Добавлено через 1 минуту
Цитата Сообщение от Luna17 Посмотреть сообщение
у меня в сортировке когда выводится список что то непонятное выводит
Это потому, что у тебя неправильный алгоритм и, следовательно, неправильная программа

Добавлено через 1 минуту
Цитата Сообщение от Luna17 Посмотреть сообщение
Введите фамилию mas -858993460 можно ли избежать того что бы печаталось mas -858993460
А как так получилось, что у тебя значение переменной i приняло значение -858993460?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2010, 18:44     Cортировка символьного двумерного массива по алфавиту
Еще ссылки по теме:

Функции двумерного массива. Транспонировать матрицу через ввод вывод функции двумерного массива. C++
Сортировка двумерного массива по алфавиту C++
Сравнивание двумерного символьного динамического массива со словом C++

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

Или воспользуйтесь поиском по форуму:
Luna17
 Аватар для Luna17
3 / 3 / 1
Регистрация: 09.03.2010
Сообщений: 95
09.03.2010, 18:44  [ТС]     Cортировка символьного двумерного массива по алфавиту #11
не знаю,
но спс за помощь основ прог правильна составлена и этого хватило на защиту
Yandex
Объявления
09.03.2010, 18:44     Cортировка символьного двумерного массива по алфавиту
Ответ Создать тему
Опции темы

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