Помощь - Поиск - Пользователи - Календарь
Полная версия: записи в Си
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
Тёмный Эльф
Посмотрите пожалуйста. У меня почему-то самая обычная сортировка не работает. Бред какой-то.

у меня объявлена такая структура
#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);
}
}

}
} }


"Один со всеми" так вроде называется. Неправильно реализовала я ее как-то.
volvo
Во-первых:
if (addr_list[l1].name>addr_list[k1].name) ...

будет делать совсем не то, что хотелось бы... Это не сравнивает строки, для сравнения строк в C есть strcmp из файла <string.h>

А во вторых, не лень было одно и то же (за исключением знака) 2 раза копировать? smile.gif Легче было бы передать еще одним параметром желаемый результат операции сравнения... Но с strcmp все становится еще проще...

Кстати, есть ведь еще memmove, которая корректно копирует один блок данных в другой, и не надо этого ужасного построчного копирования...
Тёмный Эльф
точно! strcmp же не только 0 и 1 возвращает, но и отрицательное и положительное значения. =) Забыла..
(с Паскаля привычка осталась сравнивать типа > < и = )

Цитата
Кстати, есть ведь еще memmove, которая корректно копирует один блок данных в другой, и не надо этого ужасного построчного копирования...


Про memmove честно не слышала, но не буду его трогать пока что, а то еще больше запутаюсь. Главное , чтобы сам алгоритм был правильно реализован..
Тёмный Эльф
Цитата
точно! 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
Опять Паскалевская привычка smile.gif

Индексация... Вот так - работает:

...
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) ...
Тёмный Эльф
Паскаль..Си.. в голове смешались. Спасибо, volvo, что помог разобраться.. smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.