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

Не работает сортировка по алфавиту - C++

Восстановить пароль Регистрация
 
-Arabella-
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 231
28.05.2014, 08:01     Не работает сортировка по алфавиту #1
Здравствуйте. Я пытаюсь отсортировать по алфавиту фамилии (структуры), но сортировка вставками не работает, у меня при выводе самый первый в списке пропадает, остальные выводятся в порядке ввода. Помогите, пожалуйста, найти ошибку.
Алгоритм сортировки
C++
1
2
3
4
5
6
7
8
9
10
11
for(i=1;i<n;i++)
{
strcpy(st.FIO,alp[i].FIO);
for(j=i-1;j>=0 && strcmp(alp[j].FIO,st.FIO)>0;j--)
strcpy(alp[j+1].FIO,alp[j].FIO);
st.at=alp[j+1].at;
st.time=alp[j+1].time;
st.ves=alp[j+1].ves;
st.shtuk=alp[j+1].shtuk;
printf("\n %25s  |  %5.2f  |  %2d  |  %2d  |  %5.2f", st.FIO,st.time,st.ves,st.shtuk,st.at);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2014, 08:01     Не работает сортировка по алфавиту
Посмотрите здесь:

C++ Сортировка по алфавиту
сортировка по алфавиту C++
Сортировка по алфавиту C++
Сортировка по алфавиту C++
C++ Сортировка по алфавиту
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,154
Завершенные тесты: 1
28.05.2014, 08:18     Не работает сортировка по алфавиту #2
строки 6-9 находятся вне цикла по j
-Arabella-
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 231
28.05.2014, 19:09  [ТС]     Не работает сортировка по алфавиту #3
zss, Я добавила скобки, но все равно первый пропадает, а остальные в порядке ввода выводятся, т. е. сортировка не происходит
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
for(i=1;i<n;i++)
{
strcpy(st.FIO,alp[i].FIO);
for(j=i-1;j>=0 && strcmp(alp[j].FIO,st.FIO)>0;j--)
{
strcpy(alp[j+1].FIO,alp[j].FIO);
st.at=alp[j+1].at;
st.time=alp[j+1].time;
st.ves=alp[j+1].ves;
st.shtuk=alp[j+1].shtuk;
}
printf("\n %25s  |  %5.2f  |  %2d  |  %2d  |  %5.2f", st.FIO,st.time,st.ves,st.shtuk,st.at);
}
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,154
Завершенные тесты: 1
28.05.2014, 19:19     Не работает сортировка по алфавиту #4
Копирую сюда пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void insertSort(int* a, int size) 
{
    int i, j, tmp;
    for (i = 1; i < size; ++i) // цикл проходов, i - номер прохода
    {
        tmp = a[i];  // в tmp надо скопировать ВСЕ элементы структуры
        for (j = i - 1; j >= 0 && a[j] > tmp; --j) 
        {
            a[j + 1] = a[j];    // сдвигаем ВСЮ структуру направо, пока не дошли
        }
        a[j + 1] = tmp; // место найдено, вставить тоже ВСЮ ранее скопированную структуру    
    }
}
-Arabella-
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 231
28.05.2014, 19:42  [ТС]     Не работает сортировка по алфавиту #5
zss, Я поправила по примеру, вы написали, скопировать все элементы структур в tmp, в примере tmp = st. у меня, теперь выводит теперь только 2 фамилии по несколько раз, но даже их не по алфавиту. Я правильно скопировала элементы структур?

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for(i=1;i<n;i++) 
{
strcpy(st.FIO,alp[i].FIO);
strcpy(st.FIO,alp[i].FIO);
st.at=alp[i].at;
st.time=alp[i].time;
st.ves=alp[i].ves;
st.shtuk=alp[i].shtuk;
for(j=i-1;j>=0 && strcmp(alp[j].FIO,st.FIO)>0;j--)
{
strcpy(alp[j+1].FIO,alp[j].FIO);
}
st.at=alp[j+1].at;
st.time=alp[j+1].time;
st.ves=alp[j+1].ves;
st.shtuk=alp[j+1].shtuk;
printf("\n %25s  |  %5.2f  |  %2d  |  %2d  |  %5.2f", st.FIO,st.time,st.ves,st.shtuk,st.at);
}
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
28.05.2014, 19:46     Не работает сортировка по алфавиту #6
Цитата Сообщение от -Arabella- Посмотреть сообщение
st.at=alp[j+1].at;
st.time=alp[j+1].time;
st.ves=alp[j+1].ves;
st.shtuk=alp[j+1].shtuk
какой смысл этих строк? может вместо этого надо именно сдвигать массив вправо, а не копировать одно и то же в st? (кстати, в случае с полем FIO ты именно так и сделал! strcpy(alp[j+1].FIO,alp[j].FIO) - верно, а дальше почему не...? )
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
for(i=1;i<n;i++)
{
  strcpy(st.FIO,alp[i].FIO);
  st.at=alp[i].at;
  st.time=alp[i].time;
  st.ves=alp[i].ves;
  st.shtuk=alp[i].shtuk;
  for(j=i-1;j>=0 && strcmp(alp[j].FIO,st.FIO)>0;j--)
  {
    strcpy(alp[j+1].FIO,alp[j].FIO);
    alp[j+1].at=alp[j].at;
    alp[j+1].time=alp[j].time;
    alp[j+1].ves=alp[j].ves;
    alp[j+1].shtuk=alp[j].shtuk;
  }
  strcpy(alp[j].FIO,st.FIO);
  alp[j].at=st.at;
  alp[j].time=st.time;
  alp[j].ves=st.ves;
  alp[j].shtuk=st.shtuk;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2014, 12:54     Не работает сортировка по алфавиту
Еще ссылки по теме:

C++ Сортировка по алфавиту
Сортировка по алфавиту C++
C++ Сортировка по алфавиту

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

Или воспользуйтесь поиском по форуму:
-Arabella-
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 231
29.05.2014, 12:54  [ТС]     Не работает сортировка по алфавиту #7
Kuzia domovenok,
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
кстати, в случае с полем FIO ты именно так и сделал! strcpy(alp[j+1].FIO,alp[j].FIO)
Я только FIO сделала, потому что мне надо только фамилии отсортировать, и я подумала, этого достаточно будет

Я поправила, не работает, если строки 16-20 писать, как сейчас, то выводит опять две фамилии и пустые строки, если как вы написали,
C++ (Qt)
1
2
3
4
5
strcpy(alp[j].FIO,st.FIO);
  alp[j].at=st.at;
  alp[j].time=st.time;
  alp[j].ves=st.ves;
  alp[j].shtuk=st.shtuk;
то опять же в порядке ввода и без первого. В чем еще может быть ошибка?

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
for(i=1;i<n;i++)
{
strcpy(st.FIO,alp[i].FIO);
st.at=alp[i].at;
st.time=alp[i].time;
st.ves=alp[i].ves;
st.shtuk=alp[i].shtuk;
for(j=i-1;j>=0 && strcmp(alp[j].FIO,st.FIO)>0;j--)
{
    strcpy(alp[j+1].FIO,alp[j].FIO);
    alp[j+1].at=alp[j].at;
    alp[j+1].time=alp[j].time;
    alp[j+1].ves=alp[j].ves;
    alp[j+1].shtuk=alp[j].shtuk;
}
strcpy(st.FIO,alp[j].FIO);
st.at=st.at;
st.time=alp[j].time;
st.ves=alp[j].ves;
st.shtuk=alp[j].shtuk;
printf("\n %25s  |  %5.2f  |  %2d  |  %2d  |  %5.2f", st.FIO,st.time,st.ves,st.shtuk,st.at);
}
Добавлено через 57 минут
А сравнение строк я правильно организовала?
C++
1
strcmp(alp[j].FIO,st.FIO)>0
При сравнении, например, alp[j].FIO=Ivanov и st.FIO=Petrov, функция strcmp<0 ?

Добавлено через 15 часов 52 минуты
Нашла ошибку, она была не в сортировке, а в выводе. Спасибо за помощь))
Yandex
Объявления
29.05.2014, 12:54     Не работает сортировка по алфавиту
Ответ Создать тему
Опции темы

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