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

> Внимание!

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

> записи в Си, сортировка
Тёмный Эльф
сообщение 18.05.2007 0:17
Сообщение #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);
     }
  }

 }
  } }


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

Сообщение отредактировано: Тёмный Эльф - 18.05.2007 0:18
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 5)
volvo
сообщение 18.05.2007 0:34
Сообщение #2


Гость






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

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

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

Кстати, есть ведь еще memmove, которая корректно копирует один блок данных в другой, и не надо этого ужасного построчного копирования...
 К началу страницы 
+ Ответить 
Тёмный Эльф
сообщение 18.05.2007 0:50
Сообщение #3


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

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

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


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

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


Про memmove честно не слышала, но не буду его трогать пока что, а то еще больше запутаюсь. Главное , чтобы сам алгоритм был правильно реализован..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Тёмный Эльф
сообщение 18.05.2007 1:12
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 18.05.2007 1:28
Сообщение #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) ...
 К началу страницы 
+ Ответить 
Тёмный Эльф
сообщение 18.05.2007 1:48
Сообщение #6


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

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

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


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

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

 

- Текстовая версия 27.07.2025 5:57
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"