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

С++ для начинающих

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

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

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

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

Сравнивание двумерного символьного динамического массива со словом - C++
Здравствуйте! Пожалуйста, помогите разобраться в этом условии: if (dictionary]==*word) count++; Здесь dictionary - двумерный символьный...

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

Cортировка массива. - C++
помогите с кодом, а то завтра надо уже сдать 1)При записи отсортированный массив у меня в файле записывается не через пробелы а...

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nameless One
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
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;
    }
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;
}
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,602
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]); // прочитать целое число и занести его в массив строк?
}
...
Может Вам именно на С и надо?
Luna17
3 / 3 / 1
Регистрация: 09.03.2010
Сообщений: 95
09.03.2010, 09:26  [ТС] #5
мне нужна прога на С++. точнее назв проги Visual C++
Nameless One
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
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++)
И да - Ваш алгоритм сортировки, как и мой первый вариант решения, неверен, так как в результате прохода по массиву строк будут меняться местами только соседние строки (зато второй работает)
Luna17
3 / 3 / 1
Регистрация: 09.03.2010
Сообщений: 95
09.03.2010, 09:27  [ТС] #7
Уменя ввод элементов, проходит нормально, а выводит комп какие то непонятные символы
Nameless One
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
09.03.2010, 09:30 #8
Цитата Сообщение от Luna17 Посмотреть сообщение
мне нужна прога на С++.
Мой второй вариант - как раз на С++.
И для Visual Studio, кстати, работает

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

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

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

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

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

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

Заполнение массива значениями из символьного массива - C++
есть массив символов char z;есть целочисленный массив int b;каждый символ z это цифра 0-9 нужно в b записать символ z(не код символа а...

Обработка символьного массива - C++
Итак, задание: Без использования конструкции string написать программу ввода и вывода необходимого текста с клавиатуры. Ввод...

Инициализация символьного массива - C++
Не получается инициализировать в программе символьный массив #include &lt;iostream&gt; using namespace std; struct names{ char...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.03.2010, 18:44
Ответ Создать тему
Опции темы

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