Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.83
Luna17
3 / 3 / 1
Регистрация: 09.03.2010
Сообщений: 95
#1

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

09.03.2010, 01:02. Просмотров 3297. Ответов 10
Метки нет (Все метки)

// с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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.03.2010, 01:02
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Cортировка символьного двумерного массива по алфавиту (C++):

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

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

Вывод в консоль двумерного символьного массива
Есть некий массив. char slovar = { {&quot;Slovo &quot; , &quot;Opredelenie\n&quot;}...

Сравнивание двумерного символьного динамического массива со словом
Здравствуйте! Пожалуйста, помогите разобраться в этом условии: if...

При выводе двумерного символьного массива много непонятного мусора, либо непонятные символы
Хочу разбить строку на слова, которые запишу в отдельный массив, чтобы было...

Сортировка двумерного массива по алфавиту
В Паскале: Дан список группы в 10 человек в виде ФАМИЛИЯ И.О. 20 симв. ...

10
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
09.03.2010, 04:18 #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;
    }
0
Luna17
3 / 3 / 1
Регистрация: 09.03.2010
Сообщений: 95
09.03.2010, 08:51  [ТС] #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;
}
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,230
09.03.2010, 09:09 #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]); // прочитать целое число и занести его в массив строк?
}
...
Может Вам именно на С и надо?
0
Luna17
3 / 3 / 1
Регистрация: 09.03.2010
Сообщений: 95
09.03.2010, 09:26  [ТС] #5
мне нужна прога на С++. точнее назв проги Visual C++
0
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
09.03.2010, 09:27 #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++)
И да - Ваш алгоритм сортировки, как и мой первый вариант решения, неверен, так как в результате прохода по массиву строк будут меняться местами только соседние строки (зато второй работает)
0
Luna17
3 / 3 / 1
Регистрация: 09.03.2010
Сообщений: 95
09.03.2010, 09:27  [ТС] #7
Уменя ввод элементов, проходит нормально, а выводит комп какие то непонятные символы
0
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
09.03.2010, 09:30 #8
Цитата Сообщение от Luna17 Посмотреть сообщение
мне нужна прога на С++.
Мой второй вариант - как раз на С++.
И для Visual Studio, кстати, работает

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

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

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

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

Вводи только символы латинского алфавита, не кириллицу:
А можно что нить сделать что бы русские буквы были?
0
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
09.03.2010, 09:43 #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?
0
Luna17
3 / 3 / 1
Регистрация: 09.03.2010
Сообщений: 95
09.03.2010, 18:44  [ТС] #11
не знаю,
но спс за помощь основ прог правильна составлена и этого хватило на защиту
0
09.03.2010, 18:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2010, 18:44
Привет! Вот еще темы с решениями:

Cортировка массива.
помогите с кодом, а то завтра надо уже сдать 1)При записи отсортированный...

Cортировка массива
Здравствуйте! Существует задание: Дан массив n действительных чисел. Если...

Cортировка массива.
Доброго вечера. представлен массив ,не четные элементы данного массива нужно...

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


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

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

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