البرمجة

تحسين كفاءة تكرار الكلمات في C

المشكلة التي تواجهها في الكود تبدو أنها ناتجة عن عدم التحقق من الحد الأقصى لحجم المصفوفة frequency[] والتحقق من الحد الأقصى لقيمة num_words. علاوة على ذلك، يبدو أن هناك خطأ في استخدام متغير freq بدلاً من frequency. دعني أشرح لك الطريقة الصحيحة لتصحيح هذه المشكلة.

أولاً وقبل كل شيء، يجب التحقق من أن عدد الكلمات num_words لا يتجاوز الحد الأقصى المسموح به لحجم المصفوفة words[]. ذلك لأن استخدام مصفوفة بحجم ثابت قد يؤدي إلى تجاوز حدود الذاكرة المخصصة للمصفوفة.

بعد ذلك، يجب التحقق من حجم المصفوفة frequency[] للتأكد من عدم تجاوز حدودها، خاصة إذا كانت قيمة num_words تتجاوز حد الـ1000.

وأخيرًا، يجب تصحيح الخطأ في استخدام freq[i] بدلاً من frequency[i].

بناءً على ذلك، يمكنك تحسين الكود كما يلي:

c
#include #include #define MAX_WORDS 1000 int main() { char *words[MAX_WORDS]; int frequency[MAX_WORDS] = {0}; int i, j, num_words; // Your code to initialize words[] and num_words goes here // Check if num_words exceeds the maximum allowed size if (num_words > MAX_WORDS) { printf("Error: Number of words exceeds maximum allowed size.\n"); return 1; // Exiting the program with an error code } // Count frequency of each word for(i = 0; i < num_words; i++){ for(j = i+1; j < num_words; j++){ if(strcmp(words[i], words[j]) == 0){ frequency[i]++; } } } // Print frequencies printf("Word Frequencies:\n"); for(i = 0; i < num_words; i++){ if(frequency[i] > 0){ printf("%s: %d\n", words[i], frequency[i] + 1); // Adding 1 to include the current word // Note: frequency[i] will count the occurrences of word at index i, so we add 1 to include the current occurrence } } return 0; }

هذا التعديل يتضمن التحقق من الحدود ويصحح الخطأ في استخدام frequency بدلاً من freq. كما أنه يتضمن تعليقات توضيحية لمساعدتك في فهم الكود بشكل أفضل.

المزيد من المعلومات

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

أولاً وقبل كل شيء، من الهام التأكد من قيم المتغيرات التي تستخدمها. يجب التحقق من أن num_words تحتوي على القيمة الصحيحة لعدد الكلمات في المصفوفة words[]. بالإضافة إلى ذلك، يجب أن تتأكد من أن المصفوفة words[] تحتوي على عناوين صحيحة للكلمات.

ثانيًا، يمكننا تحسين كفاءة البرنامج عن طريق استخدام هيكل بيانات أفضل لتخزين تكرار الكلمات بدلاً من استخدام مصفوفة موازية. على سبيل المثال، يمكن استخدام جدول متجه (hash table) لتخزين الكلمات كمفاتيح وعدد تكرارات كل كلمة كقيمة.

ثالثًا، يمكن استخدام دالة strtok() لتقسيم النص إلى كلمات بدلاً من تخزين كل كلمة في مصفوفة منفصلة. هذا يمكن أن يجعل الكود أكثر فعالية وسهولة في الصيانة.

إليك مثالًا على كيفية تحسين الكود باستخدام بعض هذه التحسينات:

c
#include #include #include #define MAX_WORDS 1000 #define HASH_SIZE 100 typedef struct Node { char *word; int count; struct Node *next; } Node; unsigned int hash(char *str) { unsigned int hashval = 0; while (*str != '\0') { hashval = *str + (hashval << 5) - hashval; str++; } return hashval % HASH_SIZE; } void insert(Node *hash_table[], char *word) { unsigned int index = hash(word); Node *current = hash_table[index]; while (current != NULL) { if (strcmp(current->word, word) == 0) { current->count++; return; } current = current->next; } // Word not found, insert it into the hash table Node *new_node = (Node *)malloc(sizeof(Node)); new_node->word = strdup(word); new_node->count = 1; new_node->next = hash_table[index]; hash_table[index] = new_node; } void print_word_frequencies(Node *hash_table[]) { printf("Word Frequencies:\n"); for (int i = 0; i < HASH_SIZE; i++) { Node *current = hash_table[i]; while (current != NULL) { printf("%s: %d\n", current->word, current->count); current = current->next; } } } int main() { char input_text[] = "Your input text goes here."; char *token = strtok(input_text, " "); Node *hash_table[HASH_SIZE] = {NULL}; while (token != NULL) { insert(hash_table, token); token = strtok(NULL, " "); } print_word_frequencies(hash_table); return 0; }

هذا الكود يستخدم جدول متجه (hash table) لتخزين تكرارات الكلمات، مما يزيد من كفاءة البحث والإدراج. كما يستخدم دالة strtok() لتقسيم النص إلى كلمات بدلاً من تخزين كل كلمة في مصفوفة منفصلة.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر