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

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

28.05.2014, 08:01. Просмотров 305. Ответов 6
Метки нет (Все метки)

Здравствуйте. Я пытаюсь отсортировать по алфавиту фамилии (структуры), но сортировка вставками не работает, у меня при выводе самый первый в списке пропадает, остальные выводятся в порядке ввода. Помогите, пожалуйста, найти ошибку.
Алгоритм сортировки
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);
}

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2014, 08:01
Ответы с готовыми решениями:

Сортировка по алфавиту
На вход подается некоторое количество описаний книг (автор, название,...

Сортировка по алфавиту
Не могу сообразить как по алфавиту отсортировать, что нужно изменить? Если...

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

Сортировка по алфавиту
Доброго времени суток. Имеется задача: Описать структуру с именем ORDER,...

Сортировка по алфавиту
Необходимо произвести сортировку по алфавиту по полю name. #include...

6
zss
Модератор
Эксперт С++
6985 / 6547 / 4151
Регистрация: 18.12.2011
Сообщений: 17,275
Завершенные тесты: 1
28.05.2014, 08:18 #2
строки 6-9 находятся вне цикла по j
0
-Arabella-
0 / 0 / 1
Регистрация: 20.10.2013
Сообщений: 233
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);
}
0
zss
Модератор
Эксперт С++
6985 / 6547 / 4151
Регистрация: 18.12.2011
Сообщений: 17,275
Завершенные тесты: 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; // место найдено, вставить тоже ВСЮ ранее скопированную структуру    
    }
}
0
-Arabella-
0 / 0 / 1
Регистрация: 20.10.2013
Сообщений: 233
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);
}
0
Kuzia domovenok
2243 / 2012 / 457
Регистрация: 25.03.2012
Сообщений: 7,075
Записей в блоге: 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;
}
0
-Arabella-
0 / 0 / 1
Регистрация: 20.10.2013
Сообщений: 233
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 минуты
Нашла ошибку, она была не в сортировке, а в выводе. Спасибо за помощь))
0
29.05.2014, 12:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2014, 12:54

Сортировка по алфавиту
Нужно отсортировать список студентов за месяцем рождения, Студенты, месяц у...

Сортировка по алфавиту
Правильные глаголы находятся и все нормально выводится, но сортировка по...

Сортировка по алфавиту
С клавиатуры ввести автора и название книги и посторить список по алфавиту.


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

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

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