IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> записи в Си, сортировка
сообщение
Сообщение #1


Влюблённый псих
***

Группа: Пользователи
Сообщений: 185
Пол: Женский
Реальное имя: Лейла

Репутация: -  1  +


Посмотрите пожалуйста. У меня почему-то самая обычная сортировка не работает. Бред какой-то.

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

}
} }


"Один со всеми" так вроде называется. Неправильно реализовала я ее как-то.

Сообщение отредактировано: Тёмный Эльф -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Во-первых:
if (addr_list[l1].name>addr_list[k1].name) ...

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

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

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


Влюблённый псих
***

Группа: Пользователи
Сообщений: 185
Пол: Женский
Реальное имя: Лейла

Репутация: -  1  +


точно! strcmp же не только 0 и 1 возвращает, но и отрицательное и положительное значения. =) Забыла..
(с Паскаля привычка осталась сравнивать типа > < и = )

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


Про memmove честно не слышала, но не буду его трогать пока что, а то еще больше запутаюсь. Главное , чтобы сам алгоритм был правильно реализован..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Влюблённый псих
***

Группа: Пользователи
Сообщений: 185
Пол: Женский
Реальное имя: Лейла

Репутация: -  1  +


Цитата
точно! 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);
}
}

}
} }
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Опять Паскалевская привычка 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) ...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Влюблённый псих
***

Группа: Пользователи
Сообщений: 185
Пол: Женский
Реальное имя: Лейла

Репутация: -  1  +


Паскаль..Си.. в голове смешались. Спасибо, volvo, что помог разобраться.. smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.10.2021 4:37
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name