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

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

Войти
Регистрация
Восстановить пароль
 
-Arabella-
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 233
#1

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

28.05.2014, 08:01. Просмотров 260. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не работает сортировка по алфавиту (C++):

Сортировка по алфавиту - C++
На вход подается некоторое количество описаний книг (автор, название, количество страниц). Отсортировать и вывести в алфавитном порядке по...

Сортировка по алфавиту - C++
Вот программа , там сортировка по нумерации поездов, а нужна по ПУНКТАМ назначения, кто знает поправите, спасибо. ...

Сортировка по алфавиту - C++
Здравствуйте! Помогите отсортировать содержимое каталога по алфавиту. В этом каталоге может содержаться и другая папка. Просто я не...

Сортировка по алфавиту - C++
На вход подается некоторое количество описаний книг (автор, название, количество страниц). Отсортировать и вывести в алфавитном порядке по...

Сортировка по алфавиту - C++
На вход подается некоторое количество описаний книг (автор, название, количество страниц). Отсортировать и вывести в алфавитном порядке по...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zss
Модератор
Эксперт С++
6382 / 5947 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
28.05.2014, 08:18 #2
строки 6-9 находятся вне цикла по j
0
-Arabella-
0 / 0 / 0
Регистрация: 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
Модератор
Эксперт С++
6382 / 5947 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 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 / 0
Регистрация: 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
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 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 / 0
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2014, 12:54
Привет! Вот еще темы с ответами:

сортировка по алфавиту - C++
Задача: Описать структуру с именем PRICE, содержащую следующие поля: название товара; название магазина, в котором продается...

Сортировка по алфавиту - C++
Правильные глаголы находятся и все нормально выводится, но сортировка по алфавиту не работает почему-то. В чем ошибка? for...

Сортировка по алфавиту - C++
Нужно ввести в программу данные о футболисте, отсортировать их по фамилии футболиста(т.е. первой строке таблицы) и вывести на экран....

Сортировка по алфавиту - C++
Доброго времени суток. Имеется задача: Описать структуру с именем ORDER, содержащую следующие поля: *расчетный счет плательщика ...


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

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

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