الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

طلب شرح كود : ترتيب الكلمات أبجديا

بدأه yousefal في 8 مارس 2012 · 8 رد · 3,722 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ...

لدي الكود التالي ولقد نقلته من الانترنت وحاولت استيعابه فتمكنت من ذلك جزئيا وهو مختص باحد انواع الفرز في هياكل تراكيب البيانات ..

#include <stdio.h>
#define MAX 5
#define SHOWPASS
void print(int *a, int n)
{
  int i;
  for (i = 0; i < n; i++)
    printf("%d\t", a);
}

void radixsort(int *a, int n)
{
  int i, b[MAX], m = 0, exp = 1;
  for (i = 0; i < n; i++)
  {
    if (a > m)
      m = a;
  }

  while (m / exp > 0)
  {
    int bucket[10] =
    {
      0
    };
    for (i = 0; i < n; i++)
      bucket[a / exp % 10]++;
    for (i = 1; i < 10; i++)
      bucket += bucket[i - 1];
    for (i = n - 1; i >= 0; i--)
      b[--bucket[a / exp % 10]] = a;
    for (i = 0; i < n; i++)
      a = b;
    exp *= 10;

    #ifdef SHOWPASS
      printf("\nPASS   : ");
      print(a, n);
    #endif
  }
}


int main()
{
  int arr[MAX];
  int i, n;

  printf("Enter total elements (n < %d) : ", MAX);
  scanf("%d", &n);

  printf("Enter %d Elements : ", n);
  for (i = 0; i < n; i++)
    scanf("%d", &arr);


  printf("\nARRAY  : ");
  print(&arr[0], n);

  radixsort(&arr[0], n);

  printf("\nSORTED : ");
  print(&arr[0], n);
  printf("\n");

  return 0;
}

فيا حبذا لو من يشرح هذا الكود او يقدم كود ابسط منه ...علما باني ليس الكود نفسه ليس هدفي وانما مطلوب مني كود مشابه لكلمات وليس ارقام ...ضمن تراكيب بيانات وقوائم متصلة..طرحت المشاكل التي واجهتها في مواضيع سابقة...

وانا اعرف ان هنالك جملة

RETURN(NUM/POW(10,I))%10

تعيد القيمة العشرية لكل رقم حسب منزلته .. وعذرا نقلتها دون التركيز على الاقواس..

#3

شكرا لك ... لكن انا اطلعت على كل صفحات الانترنت وكانت هذه اول واحدة .. اولا يوجد فيها كود بلغة السي .. وانا فاهم 100%مبدا العمل واريد كود .. وجدت اكواد جاهزة بلغة السي تبدو معقدة وربما هذا يكون بسيط فلمن فهمه اتمنى ان يدرجه نفسه مشروحا لكي اعمل شبيه له لنص ...او يكتب كود من عنده...

#4

يا جماعة استحلفكم بالله تساعدوني هذا طلب بسييييييييييييط .. والوقت بدا النفاذ....

#5
#include <stdio.h>
#define MAX 5
#define SHOWPASS
void print(int *a, int n)
{
  for (int i = 0; i < n; i++)
    printf("%d\t", a);
}

void radixsort(int *a, int n)
{
  int b[MAX], m = 0, exp = 1;// هنا تعريف مصفوفة عدد عناصرها أصغر أو يساوي عدد العناصر التي أدخلها المستخدم
  for (int i = 0; i < n; i++)
  {
//هنا يتم اختبار عناصر المصفوفة وكلما نمر على عنصر كبير نحتفظ بقيمته 
//m يحتفظ بقيمة أكبر عنصر في المصفوفة 
//كلما مررنا على عنصر نحتفظ بقيمته حتى نجد من هو أكبر منه وفي النهاية سيكون لدينا العنصر الأكبر بين كل العناصر
    if (a > m)
      m = a;
  }
//
//فيما يلي عملية الفرز رياضية بحتة ولا أظن أنه يمكن الاستفادة منها لغير المصفوفات الرقمية 
//
  while (m / exp > 0)
  {
    int bucket[10] ={0};
    for (i = 0; i < n; i++)
      bucket[a / exp % 10]++;
    for (i = 1; i < 10; i++)
      bucket += bucket[i - 1];
    for (i = n - 1; i >= 0; i--)
      b[--bucket[a / exp % 10]] = a;
    for (i = 0; i < n; i++)
      a = b;
    exp *= 10;

    #ifdef SHOWPASS
      printf("\nPASS   : ");
      print(a, n);
    #endif
  }
}


int main()
{
  int arr[MAX];
  int i, n;
 //هنا يتم إدخال عدد عناصر المصفوفة من المستخدم 
//وأظن أن هذه طريقة غير احترافية .. فالبرنامج لا يسمح إلا برقم أقل من حد معين 
//وهو يحجز أكثر مما يستخدم
  printf("Enter total elements (n < %d) : ", MAX);
  scanf("%d", &n);
 //الآن عملية إدخال عناصر واحداً واحداً
  printf("Enter %d Elements : ", n);
  for (i = 0; i < n; i++)
    scanf("%d", &arr);

  printf("\nARRAY  : ");
  print(&arr[0], n);//هنا استدعاء دالة طباعة عناصر المصفوفة 

  radixsort(&arr[0], n);//هنا استدعاء دالة الفرز 

  printf("\nSORTED : ");
  print(&arr[0], n);//هنا طباعة عناصر المصفوفة وذلك بعد الفرز
  printf("\n");

  return 0;
}

أرى أن هذه الطريقة في الفرز خاصة بمصفوفات الأرقام ..

لذلك إن أردت طريقة لفرز كلمات أظن أنه يمكنك فعل مايلي ::

خذ أول حرف من الكلمة .. ثم حوله إلى رقم .(سواء من جدول الآسكي أو من أرقام افتراضية من عندك )

رتب الحروف الأولى للكلمات ..

ثم استدعي الكلمة الخاصة بكل حرف . وبذلك تكون قد رتبت الكلمات حسب أول حرف ..

1
#6

سأدرس شرحك وان شاء الله نستفيد منه .. فكرة التحويل لنص .. افكر ان تكون كالتالي ساحتاج ل26 bucketبعدد الاحرف في اللغة الانجليزية .. على عكس الارقام والتي احتاج فيها لتسعة فقط .. من خلال اقتران نصي وهو strlength احدد كم مرة ساقوم بعملية التكرار وهي بالتاكيد اكثر من من الارقام لكثرة عدد الاحرف فمثلا لو كان لدينا ارقام من ثلاث منازل عشرية لكنا بحاجة للتكرار ثلاث مرات .. واعتقد ان ما تقوله صحيح بخصوص المقارنة من خلال التحويل ل الأسكي كود.

#7

السلام عليكم

قمت بإلقاء نظرة سريعة على الموضوع و لي مُداخلة بسيطة.

اقتباس
أرى أن هذه الطريقة في الفرز خاصة بمصفوفات الأرقام ..

لذلك إن أردت طريقة لفرز كلمات أظن أنه يمكنك فعل مايلي ::

خذ أول حرف من الكلمة .. ثم حوله إلى رقم .(سواء من جدول الآسكي أو من أرقام افتراضية من عندك )

رتب الحروف الأولى للكلمات ..

ثم استدعي الكلمة الخاصة بكل حرف . وبذلك تكون قد رتبت الكلمات حسب أول حرف ..

عزيزي, الأمر ليس بهذه الطريقة مع ترتيب الكلمات ! :blush:

ماذا لو كانت لديك الكلمتين abc و abd, كيف سيكون ترتيبهما ؟ :)

ترتيب الكلمات لا يعتمد على الحرف الأول فقط فقد يتساوى الأخير في بعض الكلمات .. لذا لا بد من مقارنة الكلمات مع بعضها البعض حرفا حرفا ...

يمكنك استخدام الدالة qsort لهذا الغرض.

هذا الكود يُرتب خمس كلمات يُدخلها المستخدم, (طول الكلمة يجب أن لا يتعدى 30 حرف) :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NBMOTS 5
#define TAILLEMAXMOT 31

int motcomp(const void* a,const void* b)
{
	return strcmp(a,b);
}

int main()
{
	int i;
	char tab[NBMOTS][TAILLEMAXMOT];
	for(i=0;i<NBMOTS;i++)
		scanf("%s",tab);
	qsort(tab,NBMOTS,TAILLEMAXMOT,motcomp);
	printf("\nMots tries\n\n");
	for(i=0;i<NBMOTS;i++)
		printf("%s\n",tab);
	return 0;
}

يمكنك تغيير قيمة الماكرو NBMOTS و TAILLEMAXMOT لزيادة أعمدة أو صفوف المصفوفة. و هذه مُخرجات الكود :

post-225348-022872600 1331806414_thumb.p

للمزيد عن الدالة qsort :

بالتوفيق.

المرفقات
qsort.png
#8

الله يبارك فيك اخي الشرح بالفرنسية وانا لا اجيدها ..لكن النقطة الاهم باني لا اريد اي كود وفقط وانما يقوم على مبدأ الفرز من نوع رادكس لنصوص ...وبما ان الاكواد على الانترنت كلها لارقام فخطر في بالي ان افهم احدها واحاول تقليده لكن لنصوص..

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 4 نوفمبر 2013 في 19:10 — السبب: إزالة الاقتباس

#9

@مصطفى

تتبعت شرحك لكن لم افهم الجمل الfor داخل الاقتران الرئيسي radix انا اريد فهم مبدا كل جملة على حدة حتى استطيع اسقاطها على جمل من نصوص .. اتمنى ان تكون قد وصلت الصورة...

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 4 نوفمبر 2013 في 19:31 — السبب: ازلة الاقتباس

مواضيع مشابهة