BG Development


Страници: (4) 1 [2] 3 4   ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> Сортиране на масив, сортировка по азбучен ред...
boyanov
Публикувано на: 19-05-2006, 10:28
Quote Post



Име: Константин Боянов
Група: Потребител
Ранг: Редовен член

Мнения: 339
Регистриран на: 12.05.06



QUOTE (ifch0 @ 19-05-2006, 10:12)
аз, обаче, май трябваше да спомена в началото, че трябва да е на C, и че програмата е за конзола...

На харизан кон зъбите не се гледат. icon_smile.gif


--------------------
%make love
Make: No target to make love to. Stop.
PMUsers Website
Top
ifch0
Публикувано на: 19-05-2006, 11:01
Quote Post



Име: Ивайло Киров
Група: Потребител
Ранг: Новопостъпил

Мнения: 15
Регистриран на: 18.05.06



хаха (искрен смях)
това ми хареса...
ама ако минаваше номера...
щях да напиша няколко функцийнки на Visual Basic for Applications в Excel и директно да сортирам там icon_smile.gif
Даже и това нямаше да правя - направо щях да му дам Data -> Sort icon_smile.gif
PMEmail PosterUsers WebsiteICQ
Top
wqw
Публикувано на: 19-05-2006, 11:31
Quote Post


Group Icon
Име: Владимир Висулчев
Група: VIP
Ранг: Почетен член

Мнения: 6249
Регистриран на: 10.06.04



Не си уточнил езикът, не си уточнил кой компилатор ползваш, не си уточнил по кой атрибут сортираш, нямаш идея как се използват структури от данни, алгоритмите те плашат. (Посмей се искрено и на това ако искаш... докато не си порастнал!:-))

Явно и документацията на qsort те затруднява, затова разгледай следната примерна реализация:
CODE
// VC6
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define countof(a) (sizeof(a)/sizeof(*(a)))

typedef struct {
   char *name;
   char *origin;
   bool is_protected;
} bird;

int compare_birds_by_name_asc(const void *a, const void *b) {
   return strcmp(((bird *)a)->name, ((bird *)b)->name);
}

void main() {
   bird arr[] = {
       { "Sparrow", "Europe", true },
       { "Stork", "Asia", true },
       { "Bluebird", "North America", true },
       { "Falcon", "North America", true },
   };
   int i;

   qsort(arr, countof(arr), sizeof(*arr), compare_birds_by_name_asc);
   for(i = 0; i < countof(arr); i++)
       printf("name: %s\n", arr[i].name);
}

cheers,
</wqw>


--------------------
PMEmail PosterUsers Website
Top
ifch0
Публикувано на: 19-05-2006, 12:40
Quote Post



Име: Ивайло Киров
Група: Потребител
Ранг: Новопостъпил

Мнения: 15
Регистриран на: 18.05.06



Мерси много!
Това ми помогна!

Документацията на qsort ме затрудни... Четох в хелп-а, гледах примери - не успях да го схвана... Иначе, не съм чак толкова зле с масивите... Ама... Все пак го уча т'ва за първа година icon_smile.gif

Освен това, написах, че в началото, структурата е от три елемента, които записвам във файл. Информацията във файла е записана така:
CODE
fprintf(pf, "Name %-20s, Origin %-20s, Protected %1d\n", arr[i].name, arr[i].origin, arr[i].prot);

(prot го направих digit - 1 или 0)
След това, когато отворя файла, създавам нов масив (char arr[N][68])
Така, всяко arr[i][68], съдържа цялата информация за една птица, (символите на всеки ред са 67 + знака за нов ред). И вече, просто (icon_smile.gif) трябва да сортирам този масив.

Благодаря отново!


До модератора:
Може да затваряте темата.

Благодаря на всички за помощта!

Това мнение е било редактирано от ifch0 на 19-05-2006, 13:47
PMEmail PosterUsers WebsiteICQ
Top
PxL
Публикувано на: 19-05-2006, 17:22
Quote Post


Group Icon
Име: Димитър Т. Димитров
Група: VIP
Ранг: Почетен член

Мнения: 3521
Регистриран на: 26.04.05



Супер тема може да има още доста да се говори по нея ето и една имплементация на Bubble Sort на C:

CODE

#define MAX 100

void swap(int *x, int *y)
{
 int tmp;
 
 tmp = *x;
 *x = *y;
 *y = tmp;
}

void bsort(int arr[], int size)
{
    int i,j;

    for(i = 0; i < size; i++)
      for(j = size - 1; j > i; j--)
       if (arr[j] > arr[j-1])
          swap(&arr[j], &arr[j-1]);
}

main()
{
   int array[MAX];
   int i;

   printf("\nBubble sort demo by PxL\n\n");


   for (i = 0; i < MAX; i++)
   {
       array[i] = rand() % MAX + 1;
       printf("%4i", array[i]);
   }

   bsort(array, MAX);
   printf("\n----------------------------\n\n");

   for (i = 0; i < MAX; i++)
       printf("%4i", array[i]);
}



EDIT: Ето и една за selection sort icon_smile.gif :
CODE

#define MAX 100

void swap(int *x, int *y)
{
 int tmp;
 
 tmp = *x;
 *x = *y;
 *y = tmp;
}

void selection(int a[], int size)
{
 int i, j, max;

 for(j = size-1; j > 0; j--)
   {    
     max = 0;
     
     for (i=0; i < j+1; i++)
         if (a[i] > a[max])
           max = i;

     swap( &a[max], &a[j]);
   }
}


main()
{
   int array[MAX];
   int i;

   printf("\nSelection sort demo by PxL\n\n");


   for (i = 0; i < MAX; i++)
   {
       array[i] = rand() % MAX + 1;
       printf("%4i", array[i]);
   }

   selection(array, MAX);
   printf("\n----------------------------\n\n");

   for (i = 0; i < MAX; i++)
       printf("%4i", array[i]);
}




Това мнение е било редактирано от PxL на 19-05-2006, 17:30


--------------------
void putchar(char c);int main(){int x,c=1,i;for(i=0;(x="PxLY2H4:2E;7231?=68255A5S5P9N:N9O84111H861I85111G9N:O811O812M<G33911EAEDBECE22169D1=2k"[i+++3]);)while(x-->'0')putchar((!(++c%'('))?0x0a:33^(i&1));}
PMEmail PosterUsers Website
Top
ifch0
Публикувано на: 19-05-2006, 17:33
Quote Post



Име: Ивайло Киров
Група: Потребител
Ранг: Новопостъпил

Мнения: 15
Регистриран на: 18.05.06



Хмм... Интересни неща! Това с функцията "swap" ми хареса!
PMEmail PosterUsers WebsiteICQ
Top
PxL
Публикувано на: 19-05-2006, 17:48
Quote Post


Group Icon
Име: Димитър Т. Димитров
Група: VIP
Ранг: Почетен член

Мнения: 3521
Регистриран на: 26.04.05



QUOTE (ifch0 @ 19-05-2006, 17:33)
Хмм... Интересни неща! Това с функцията "swap" ми хареса!

Честно казано за swap просто така го написах сега, иначе има и по-"хитри" методи:
CODE

a = a xor b
b = b xor a
a = a xor b


--------------------
void putchar(char c);int main(){int x,c=1,i;for(i=0;(x="PxLY2H4:2E;7231?=68255A5S5P9N:N9O84111H861I85111G9N:O811O812M<G33911EAEDBECE22169D1=2k"[i+++3]);)while(x-->'0')putchar((!(++c%'('))?0x0a:33^(i&1));}
PMEmail PosterUsers Website
Top
wqw
Публикувано на: 19-05-2006, 18:19
Quote Post


Group Icon
Име: Владимир Висулчев
Група: VIP
Ранг: Почетен член

Мнения: 6249
Регистриран на: 10.06.04



@PxL: Знаеш, че от такива трикове боли глава. Примерно ако се изтарикатиш с подобна имплементация на твоята void swap(int *x, int *y), можеш да се опариш лошо в eдин такъв случай:
CODE
int i = 5;
swap(&i, &i);

ouch! i е 0 след "swap"-а :-))

cheers,
</wqw>


--------------------
PMEmail PosterUsers Website
Top
ifch0
Публикувано на: 19-05-2006, 18:24
Quote Post



Име: Ивайло Киров
Група: Потребител
Ранг: Новопостъпил

Мнения: 15
Регистриран на: 18.05.06



Ееее... Сега... Нали ако ползваш нещо, знаеш защо го правиш точно такова, а не някакво друго...
Имам в предвид, все пак, знаеш какво точно прави програмата ти...

Това мнение е било редактирано от ifch0 на 19-05-2006, 18:24
PMEmail PosterUsers WebsiteICQ
Top
PxL
Публикувано на: 19-05-2006, 18:24
Quote Post


Group Icon
Име: Димитър Т. Димитров
Група: VIP
Ранг: Почетен член

Мнения: 3521
Регистриран на: 26.04.05



QUOTE (wqw @ 19-05-2006, 18:19)
@PxL: Знаеш, че от такива трикове боли глава. Примерно ако се изтарикатиш с подобна имплементация на твоята void swap(int *x, int *y), можеш да се опариш лошо в eдин такъв случай:
CODE
int i = 5;
swap(&i, &i);

ouch! i е 0 след "swap"-а :-))

cheers,
</wqw>

Съгласен, трябва и проверка дали са равни, просто го казвам като вариант icon_smile.gif


--------------------
void putchar(char c);int main(){int x,c=1,i;for(i=0;(x="PxLY2H4:2E;7231?=68255A5S5P9N:N9O84111H861I85111G9N:O811O812M<G33911EAEDBECE22169D1=2k"[i+++3]);)while(x-->'0')putchar((!(++c%'('))?0x0a:33^(i&1));}
PMEmail PosterUsers Website
Top
0 потребители преглеждат тази тема в момента (0 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (4) 1 [2] 3 4  Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0