![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() |
Тёмный Эльф |
![]()
Сообщение
#1
|
![]() Влюблённый псих ![]() ![]() ![]() Группа: Пользователи Сообщений: 185 Пол: Женский Реальное имя: Лейла Репутация: ![]() ![]() ![]() |
Посмотрите пожалуйста. У меня почему-то самая обычная сортировка не работает. Бред какой-то.
у меня объявлена такая структура #define MAX 100
struct addr
{
char name[10];
char surname[20];
char patronymic[30];
char address[40];
char telephone[20];
} addr_list[MAX];
затем выбирается сортировка (по убыванию/по возрастанию) void COPTIPOBKA(void)
{ char i[2]; int d;
textcolor(WHITE);
printf("\n\rIf you wish to sort on decrease press 1 else press 0: \n\r");
gets(i);
d=atoi(i);
switch (d) {
case 1: COPTIPOBKA_on_decrease();
break;
case 0: COPTIPOBKA_on_increase();
break;
}
clrscr();
return;
}
эта функция я использую, чтобы знать сколько записей уже внесено int find_free(void)
{register int t;
for(t=0; addr_list[t].name[0] && t<MAX; ++t);
if (t==MAX) return -1;
return t;
}
И вот эти две бредовые сортировки:
void COPTIPOBKA_on_increase()
{int k1,l1,i,slot;
char s[50]; char l[50]; char l2[50]; char l3[50]; char l4[50];
slot=find_free();
for (k1=0; k1<=slot; k1++)
{ for(l1=1; l1<slot; l1++)
{
if (addr_list[l1].name>addr_list[k1].name)
{
strcpy(s,addr_list[k1].name);
strcpy(l,addr_list[k1].surname);
strcpy(l2,addr_list[k1].patronymic);
strcpy(l3,addr_list[k1].address);
strcpy(l4,addr_list[k1].telephone);
strcpy(addr_list[k1].name,addr_list[l1].name);
strcpy(addr_list[k1].surname, addr_list[l1].surname);
strcpy(addr_list[k1].patronymic,addr_list[l1].patronymic);
strcpy(addr_list[k1].address,addr_list[l1].address);
strcpy(addr_list[k1].telephone,addr_list[l1].telephone);
strcpy(addr_list[l1].name,s);
strcpy(addr_list[l1].surname,l);
strcpy(addr_list[l1].patronymic,l2);
strcpy(addr_list[l1].address,l3);
strcpy(addr_list[l1].telephone,l4);
}
}
}
}
void COPTIPOBKA_on_decrease()
{
{int k1,l1,i,slot;
char s[50]; char l[50]; char l2[50]; char l3[50]; char l4[50];
slot=find_free();
for (k1=0; k1<=slot; k1++)
{ for(l1=1; l1<slot; l1++)
{
if (addr_list[l1].name<addr_list[k1].name)
{
strcpy(s,addr_list[l1].name);
strcpy(l,addr_list[l1].surname);
strcpy(l2,addr_list[l1].patronymic);
strcpy(l3,addr_list[l1].address);
strcpy(l4,addr_list[l1].telephone);
strcpy(addr_list[l1].name,addr_list[k1].name);
strcpy(addr_list[l1].surname, addr_list[k1].surname);
strcpy(addr_list[l1].patronymic,addr_list[k1].patronymic);
strcpy(addr_list[l1].address,addr_list[k1].address);
strcpy(addr_list[l1].telephone,addr_list[k1].telephone);
strcpy(addr_list[k1].name,s);
strcpy(addr_list[k1].surname,l);
strcpy(addr_list[k1].patronymic,l2);
strcpy(addr_list[k1].address,l3);
strcpy(addr_list[k1].telephone,l4);
}
}
}
} }
"Один со всеми" так вроде называется. Неправильно реализовала я ее как-то. Сообщение отредактировано: Тёмный Эльф - 18.05.2007 0:18 |
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Во-первых:
if (addr_list[l1].name>addr_list[k1].name) ...
будет делать совсем не то, что хотелось бы... Это не сравнивает строки, для сравнения строк в C есть strcmp из файла <string.h> А во вторых, не лень было одно и то же (за исключением знака) 2 раза копировать? ![]() Кстати, есть ведь еще memmove, которая корректно копирует один блок данных в другой, и не надо этого ужасного построчного копирования... |
Тёмный Эльф |
![]()
Сообщение
#3
|
![]() Влюблённый псих ![]() ![]() ![]() Группа: Пользователи Сообщений: 185 Пол: Женский Реальное имя: Лейла Репутация: ![]() ![]() ![]() |
точно! strcmp же не только 0 и 1 возвращает, но и отрицательное и положительное значения. =) Забыла..
(с Паскаля привычка осталась сравнивать типа > < и = ) Цитата Кстати, есть ведь еще memmove, которая корректно копирует один блок данных в другой, и не надо этого ужасного построчного копирования... Про memmove честно не слышала, но не буду его трогать пока что, а то еще больше запутаюсь. Главное , чтобы сам алгоритм был правильно реализован.. |
Тёмный Эльф |
![]() ![]()
Сообщение
#4
|
![]() Влюблённый псих ![]() ![]() ![]() Группа: Пользователи Сообщений: 185 Пол: Женский Реальное имя: Лейла Репутация: ![]() ![]() ![]() |
Цитата точно! strcmp же не только 0 и 1 возвращает, но и отрицательное и положительное значения. Да нет. все-равно ерунда получается. Значит, что-то с алгоритмом не так? COPTIPOBKA_on_decrease()
{
{int k1,l1,i,slot;
char s[50]; char l[50]; char l2[50]; char l3[50]; char l4[50];
slot=find_free();
for (k1=0; k1<=slot; k1++)
{ for(l1=1; l1<slot; l1++)
{
if (strcmp(addr_list[l1].name,addr_list[k1].name)<0)
{
strcpy(s,addr_list[l1].name);
strcpy(l,addr_list[l1].surname);
strcpy(l2,addr_list[l1].patronymic);
strcpy(l3,addr_list[l1].address);
strcpy(l4,addr_list[l1].telephone);
strcpy(addr_list[l1].name,addr_list[k1].name);
strcpy(addr_list[l1].surname, addr_list[k1].surname);
strcpy(addr_list[l1].patronymic,addr_list[k1].patronymic);
strcpy(addr_list[l1].address,addr_list[k1].address);
strcpy(addr_list[l1].telephone,addr_list[k1].telephone);
strcpy(addr_list[k1].name,s);
strcpy(addr_list[k1].surname,l);
strcpy(addr_list[k1].patronymic,l2);
strcpy(addr_list[k1].address,l3);
strcpy(addr_list[k1].telephone,l4);
}
}
}
} }
|
volvo |
![]()
Сообщение
#5
|
Гость ![]() |
Опять Паскалевская привычка
![]() Индексация... Вот так - работает: ...
slot=find_free();
for (k1=0; k1<slot-1; k1++) {
for(l1=k1+1; l1<slot; l1++) {
if (strcmp(addr_list[l1].name,addr_list[k1].name)<0) ...
|
Тёмный Эльф |
![]()
Сообщение
#6
|
![]() Влюблённый псих ![]() ![]() ![]() Группа: Пользователи Сообщений: 185 Пол: Женский Реальное имя: Лейла Репутация: ![]() ![]() ![]() |
Паскаль..Си.. в голове смешались. Спасибо, volvo, что помог разобраться..
![]() |
![]() ![]() |
![]() |
Текстовая версия | 27.07.2025 5:57 |