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

[تنبيه - عنوان غير مناسب : ]Arrays

بدأه looletta في 23 مارس 2008 · 24 رد · 1,936 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

ممكن احد يشرحلي كيفية دمج المصفوفات

مثلا لو عندي نص تم ادخاله من قبل المستخدم

وهذا النص اخزنه حرف حرف في مصفوفة (طولها 26 ) من غير تكرار للأحرف والباقي نخزن فيه باقي الحروف الأبجدية الغير موجودة في النص الي دخله المستخدم

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

انا عملتها انه يتوقف الإدخال بوجود المسافة بشرط while

والمقارنة بfoor loop

لكن ما مشي معاي البرنامج صح

أرجو انه يكون شرحي واضح؟

تم تعديل هذه المشاركة بواسطة looletta في 23 مارس 2008 في 20:24

#2
اقتباس
مصفوفة (طولها 26 ) من غير تكرار للأحرف والباقي نخزن فيه باقي الحروف الأبجدية الغير موجودة في النص
26 حرف بدون تكرار سيغطي كل الحروف الأبجدية وبهذا لن تجد حروفا تضعها في المصفوفة الثانية الا اذا كنت تعتبر A حرف و a حرف آخر....

---------------------

ثاني شي... بدك كود ولا خطوات عمل (خوارزميّة)؟

#3

هي كل مصفوفة طولها 26

الأولى تحتوي على الحروف الأبجدية مرتبة

والثانية ابغى استخدمها للتخزين

فلما المستخدم يدخل كلمة ناخذ هذه الكلمة ونشوف اذافيها حرف مكرر احذفة بعدين اخزنها في المصفوفة والمكان الفارغ فيها (الباقي) نخزن فيه

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

#4

خوارزمية أو كود ..... اي شي للشرح ....بس كودافضل (فهمه اسهل)

#5

ما أحد جاوبلي على سؤالي؟؟؟؟؟؟؟؟

فين الناس؟

#6
looletta كتب:
ما أحد جاوبلي على سؤالي؟؟؟؟؟؟؟؟

فين الناس؟

اذا اردت الحصول على مساعدة فينبغي وضع محاولتك في حل الاشكال و الا فان الموضوع مخلف لقوانين المنتدى

#7

العنوان غير مناسب

الرجاء اختيار عنوان مناسب أكثر في مواضيعك القادمة، وهذا بمثابة إشعار للأهمية.

وفي حال التكرار سيتعرض موضوعك للإغلاق والحذف!!!

قواعد المشاركة

/index.php?showtopic=29343

#8
اقتباس
خوارزمية أو كود ..... اي شي للشرح ....بس كودافضل (فهمه اسهل)

هل أنت جاد !!!

وحده من الثنتين إما إنك أنشتاين في البرمجه أو أنك لاتعلم مامعنى البرمجه

(أخي من المواضح أنه واجب ) لأنك مستعجل لهذه الدرجه ليش

أما بالنسبه لفكرة البرنامج فهي بسيطه

ستحتاج إلى two strings

الأولى

إجعل المستخدم يدخل الكلمه فيها

ثم إحسب طولها (أي عدد الأحرف التي فيها ) لكي نضعه في عداد

الثانيه

لكي تخزن فيها الأحرف الغير المكرره

الآن إعمل العداد

وكتب فيه شرط إذا كانت هذه الدوره الأوله (فإن الحرف الأول سيكون غير مكرر لأنه أول حرف تختبره)

ثم تحقق من كل حرف في string الأول إذا كان موجود في string الثاني

فإذا كان موجود لاتخزنه

غير ذلك

خزنه في string الثاني

فقط هذا اللي تكتبه في loop

الآن لتخزن الأحرف البقيه إعمل string ثالث خزن فيها الأحرف الأبجديه بالترتيب

و إعمل loop ثاني وجعله يتحقق من كل حرف في string الثالث إذا كان موجود في الstring الثاني

إذا لم يكن موجود خزنه

هذه إحدى الطرق وهناك طرق أخرى

وأيضا أريد أن أنبه أنك تستطيع إستبدال string بال المصفوفات النصيصه

ولكن string أسهل وهناك درس موجود في المنتدى يشرحها

أيضا أريد أن أنبه أنني أستطيع كتابت الكود وهو أيسر لي من كتابت الشرح ولكنك لن تستفيد من ذلك

بالتوفيق

#9

هناك طريقة لكن معقدة، ربما هناك طرق كثيرة أسهل، لــــكن هذه الطريقة أقوى، وأسرع..(ربي يوفقني في الشرح)

تخيل انه لديك جدول فيه الحروف الابجدية...

[a][c][d][e][f][g][h][j]......[z]

الآن نمر على الكلمة التي كتبها المستخدم حرفا حرفا..

اذا وجدنا الحرف a نقوم بزيادة الجدول في المكان a بـ 1 (++).

عندما ننتهي من المرور على الكلمة سيصبح عندنا في الجدول قيمة من 3 قيم لكل حرف.. 0 الحرف غير موجود في كلمتك 1- الحرف موجود مرة واحدة في كلمتك 2- الحرف مكرر في كلمتك.

مثال:

المستخدم أدخل abbcdfg

سيصبح الجدول كالتالي:

LEFT TO RIGHT

|a|b|c |d|e|f|g |h| i | j |........|z|

|1|2|1|1|0|1|1|0|0|0|......|0|

الآن لديك كشف بكل ما تريد...

تمرّ على كلمتك وتنسخ كل حرف غير مكرر (يحمل1) إلى مصفوفة فارغة.. بعدها تذهب إلى المصفوفة التي تحوي كل الحروف، وتنسخ الى المصفوفة الفارغة كل حرف يحمل القيمة (0) أي غير مذكور في كلمتك...

وهكذا يُحل سؤالك...

--------------------------------

التطبيق بالكود سآتيك به بإذن الله عندما اتفرّغ، إذا لم يأتكَ به عضو غيري..

تم تعديل هذه المشاركة بواسطة إسماعيل ابراهيم في 23 مارس 2008 في 23:14

#10

أعرض محاولاتي

في المرفقات

monoalphabet1.rar

#11
اقتباس
هل أنت جاد !!!

وحده من الثنتين إما إنك أنشتاين في البرمجه أو أنك لاتعلم مامعنى البرمجه

لا أعلم إذا كان المبتدئ في علم ما مدعاة للسخرية!!!

أنا طلبت شرح لعدم فهمي لفكرة تطبيقها ....(أقصد لا تشرطات)

ثم أن معرفتي للخوارزم هو انه شرح للكود بالغة الطبيعة ..... فإذا كان فهمي خطأ ياريت توضحلي لأني لاأعلم ماسبب استغرابك

وشكرا على الشرح... مع اني اراه صعب التطبيق لأني بدأت حلي بArray

يا أخ اسماعيل .... ماذا تقصد بعمل جدول؟

هل هو مصفوفة حرفية ؟؟؟

#12

أخي أنا لم أقصد السخريه

ولكن أنت قلتها الخوارزميات تكون بلغه مفهومه(طبيعيه)

فهل الشفره(code( أسهل من اللغه الطبيعيه؟

شيأ آخر (نصيحه)

قبل جلوسك على computer ومحاولة عمل برنامج ما

إمسك لك ورقه وقلم و بدأ حلل ورتب أفكارك ومن ثم إعمل الخوارزميه

وتالي آخر خطوه هي عملية كتابت الكود

اقتباس
وشكرا على الشرح... مع اني اراه صعب التطبيق لأني بدأت حلي بArray

سأكتب لك الكود غذا إن شاء الله لأني مشغول حاليا

وأيضا خذ مثال الأخ إسماعيل وشوف اللي يناسبك

بالتوفيق

#13

ها هو الكود... اي سؤال أنا جاهز... ربما تجد عدم نظام..بسبب استعجالي في وضع الكود ... صراحة الموضوع شغلني خلال السهرة فعدت للبيت لوضع الحل وهو سريع وربما غير مشروح بما فيه الكفاية... لــــــــــــكن بإذن الله اي سؤال(حول الكود) انا جاهز

// 10.cpp : Defines the entry point for the console application.
//programmed By Esmaeel Ibraheem: arabteam 2000

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
	int Counter[26]={0},c=0;
	char str[27];
	char *userStr="happy day"; // we deal with small letters U can add the ability for dealing with Capital letters
	for(int i=0;userStr;i++)
		Counter[userStr-'a']++; //a--->0 , b--->1...ect if a the counter[0]++ if d counter[3]++
//----------------------now you have the table of the letters ----------------------------
int y=0;
while(userStr[c])
	{
		if(Counter[(userStr[c])-'a']<2 && userStr[c]!=' ') //اذا كان حرف مذكور مرة واحدة
		{
		str[y]=userStr[c];// اضافته الى المصفوفة
		y++; // نتقدم بالمصفوفة حرف
		}else if (Counter[(userStr[c])-'a']==2) {str[y]=userStr[c];Counter[(userStr[c])-'a']=3;y++;}
		// وإلا اذا كان مكرر نضيفه ونزيد عداده لكي يصبح 3 وبهذا لن يجيب على الشروط التالية
	c++; // التقدم على مصفوفة المستخدم
	}

for (int m=0; y<26;m++) // المرور على كل الحروف الابجدية
if(Counter[m]==0) // الحرف حسب العداد لم يكن في مصفوفة المستخدم
	str[y++]=m+'a'; // هذا الحرف سيضاف للمصفوفة من المكان الذي انتهت فيه مصفوفة المستنخدم

str[y]=NULL; // اغلاق المصفوفة
printf("User input is: %s \n reasult is:>%s",userStr,str); // طباعة الناتج

return 0;
}
#14

يا أخ إسماعيل.... ال header file

#include "stdafx.h غير معرف لدي

وأناما درستها..... فحسيتها غريبة لأني اكتب البرامج بال iostream , fstream ,string

char *userStr="happy day"; // we deal with small letters U can add the ability for dealing with Capital letters

for(int i=0;userStr;i++)

Counter[userStr-'a']++; //a--->0 , b--->1...ect if a the counter[0]++ if d counter[3]++

هذه الجزئية ما فهمتها

#15
اقتباس
#include "stdafx.h غير معرف لدي
أخي استبدله بـ

#include<stdio.h>

---------------------------------------------------------------

أما:

char *userStr="happy day";

فهو مؤشّر، (استعملته لانشاء مصفوفة) وضعت داخل المصفوفة الجملة"happy day"

----------------------------------------------------------------------

أما:

for(int i=0;userStr;i++)
Counter[userStr-'a']++; //a--->0 , b--->1...ect if a the counter[0]++ if d counter[3

هذا لب الفكرة ويحتاج تركيز كما قلت لك.

نمرّ على حروف الجملة happy day حرفاً حرفًا...

انتبه أخي للشرح:

لدك مصفوفة رقمية تتكون من 26 رقم هذا هو العداد... فعندما نجد حرف a سنقوم بزيادة العداد في المكان 0 بـ1 وعندما نجد مثلا حرف d نقوم بزيادة العداد في المكان 3 (رابع حرف لأن العد من صفر) بـ 1 وعندما نجد مثلا حرف b نقوم بزيادة العداد في المكان 1 (الحرف الثاني)، وهكذا...(العداد هو مصفوفة رقمية تمثّل الأبجدية - تمثلها في عقلنا في الكود هي ارقام نحن نزيد المكان المناسب حسب الحرف الذي معنا)

الآن لتطبيق هذا قمنا بالعملية التي أمامك..

Counter[userStr-'a']++;

العداد في المكان (الحرف الذي معنا) نطرح منه قيمة الأسكيي للـ a

لنبدأ بالحرف الأول : h

العداد في المكان 'h'-'a' حسب قيم الأسكي h=104 والـ a=97

104-97=7 اي اننا اذا كان الحرف h سيزيد المكان [Counter[7 أي ثامن حرف في العداد وبالفعل فإن h هو ثامن حرف في الابجدية.

الآن مثال آخر الحرف a سوف يؤدي إلى التالي['Counter['a'-'a أي [Counter[0 .. أي في اول مكان في المصفوفة وبالفعل فالحرف a أول حرف في الابجدية...أي كل حرف يزيد العداد في مكان (خليّة) محددة في المصفوفة...

الآن الحرف p قيمة الاسكي: 112 نطرح منها قيمة الاسكيي للـ a أي97

112-97 =15 أي المكان السادس عشر في الخلية نزيدة (++) وبالفعل الحرف p هو الحرف السادس عشر في الابجدية...

في النهاية ستكون عندنا مصفوفة من 26 خلية فيها الخلية الأولى 2 لأن الحرف a ذٌكر مرتين..,والخلية الثانية 0 لأن b لم يرد في المصفوفة...

ارجو ان اكون قد وضحت الغموض... (هي لعبة ascii في النهاية)...

تم تعديل هذه المشاركة بواسطة إسماعيل ابراهيم في 24 مارس 2008 في 11:29

#16

باختصار : بدل ما اعمل جولة switch لأقول التالي:

اذا كان الحرف a نزيد المكان 0

اذا كان الحرف b نزيد المكان 1

اذا كان الحرف c نزيد المكان 2

اذا كان الحرف d نزيد المكان 3

اذا كان الحرف e نزيد المكان 4

اذا كان الحرف f نزيد المكان 5

اذا كان الحرف g نزيد المكان 6

اذا كان الحرف h نزيد المكان 7

-

-

إلى آخر الحروف... طبقنا هذا بطريقة ذكية وهي تحويل الحرف نفسه الى المكان الذي نريد وذلك بطرح القيمة 'a' منه (طبعا اذا كان حرف كبير نطرح منه 'A' )

#17

طيب ممكن لو أضع محاولتي ألقى أحد يشيكلي على الكود ويقولي فين الخطأ؟؟؟

لأن البرنامج الي عملته ماينفذ بعض الشروط مثل إذا كان الحرف مكررمايخزنة!!!

#18
اقتباس
لأن البرنامج الي عملته ماينفذ بعض الشروط مثل إذا كان الحرف مكررمايخزنة!!!
لا يا أخي البرنامج اللي اعطيتك اياه يضع الحرف المكرر لكن مرة واحدة فقط

يعني happy day تصبح hapyd

ثم يليها باقي الحرف التي لم تظهر في الجملة.

أخي برنامجي يحتاج تركيز وتحليل وسوف تستفيد منه...

التشييك على محاولاتك... لا اعدك ربما اساعدك ربما لا.. حسب ضروفي!

سلام.

تم تعديل هذه المشاركة بواسطة إسماعيل ابراهيم في 25 مارس 2008 في 01:51

#19

أخي اعتذر عن وضع هذا الحل، هذا حل متقدم نوعا ما، وأنا لم اكن اعرف انك مبتدئ...

وأرجو الاّ تحبط عند رؤية هذا الحل وتقول في نفسك تم حل السؤال خلال ساعة لماذا لم أحله أنا...فأنا أخبرك ان هذا الحل قمت به قبل سنوات، وكان لسؤال شبيه بسؤالك، كان السؤال يطلب كل حرف كم مرة تكرر في الجملة.. وما الحرف الاكثر تكرارا... قمت بحله بطريقة شبيهه بهذه التي امامك وأخذ مني جهد ووقت طويل..... أقول هذا الكلام لأني في بداية تعلّمي كنت أكتئب من الحلول المعقدة، وأقول لنفسي " لماذا لم أحلّه أنا بهذه الطريقة" .. وكان هذا يسبب لي كآبة التعلّم، لهذا اخبرتك بقصة هذا الحل لأني لا اريد لك هذا الشعور..

أكرر إعتذاري عن هذا الحل المسبب للإكتآب عند المبتدئين :)

أرجو أن تفهمني

سلام

تم تعديل هذه المشاركة بواسطة إسماعيل ابراهيم في 25 مارس 2008 في 01:39

#20

حسيت ان الكود الي وضعته معقد وما قدرت أفهمه صراحة؟؟؟

والحقيقة حسيت بالإحباط .... لأن البرنامج استغرق مني وقتوليس كما المطلوب... لكن سأكرر المحاولة...

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

معليش انا اقصد البرنامج الي انا عملته ....

#21

السلام عليكم هذا الكود يعمل المطلوب.

#include<iostream>
#include<string>
using namespace std;
int main()
{
string a;
string b;
a.resize(26); 
int k=0;
for(int i=int('a');i<=int('z');i++)  a[k++]=char(i); 
cout<<"enter any thing:";
cin>>b;
string c ;
c.resize(b.size()+a.size()  ); 
c=b+a; 

    for(int i=0;i<c.length() ;i++)
    for(int j=i+1;j<c.length() ;j++)
    {
     if(c==c[j]) c[j]='*';
    }

        string h;
        h.resize(26); 
        int t=0;
    for(int i=0;i<c.length() ;i++)
    {
        if(c!='*')
          h[t++]=c;
    }
cout<<h;
}
tvquran_6.gif

#22

مشكوور اخي عمل الكود المطلوب ...... بس عندي استفسارات 1- ما عمل دالة ressize() هل هي تعطي المتغير الي قبلها© حجم المتغير

الموجود في الأقواس(b.size()+a.size() ); ؟

2- مالفرق بين دالة length() ودالة size() اليست كلها لإيجاد الحجم؟

3-

for(int i=int('a');i<=int('z');i++) a[k++]=char(i);

هذا الشرط يقوم بتخزين الأحرف الأبجدية في المتغير a

int i=int('a');

وهنا أعطينا ال i قيمة الحرف a العددية (فهمي صحيح أم لا ؟)

4-

for(int i=0;i<c.length();i++)
for(int j=i+1;j<c.length();j++)
{
if(c==c[j]) c[j]='*';
}

أما هذه الجزئية مافهمتها .... ماذا تعني المساواة بال'*' ????

و عذرا على الإطالة؟

تم تعديل هذه المشاركة بواسطة looletta في 26 مارس 2008 في 02:30

#23

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

#include<iostream>
#include<string>
using namespace std;
int main()
{
string a;
string b;
a.resize(26); //حجز مساحة للعنصر بمقدار 26 حرف. 
int k=0;
for(int i=int('a');i<=int('z');i++)  a[k++]=char(i);      //هنا تخزن الحروف     
cout<<"enter any thing:";
cin>>b;
string c ;
c.resize(b.size()+a.size()  ); //حجز مساحة للنص تساوي مساحة النصين مجتمعين 
c=b+a;            //وضع النصين بجانب بعض بنفس الترتيب
    for(int i=0;i<c.length() ;i++)
    for(int j=i+1;j<c.length() ;j++)
    {
        //هنا اختبار هل العنصر مكرر اذا كان مكرر يضع في المررة نجمة بدل الحرف المكرر
     if(c==c[j]) c[j]='*'; 
    }
        string h;
        h.resize(26); //حجز مساحة لنص سوف نستخدمة من أجل نسخ الحروف بدون النجمة 
        int t=0;
    for(int i=0;i<c.length() ;i++)
    {
        if(c!='*')//شرط اذا كان الحرف ليس نجمة انسخة الى النص الجديد
          h[t++]=c;
    }
cout<<h;
}
tvquran_6.gif

#24

شكرا على التوضيح

#25

السلام عليكم,

لماذا لا تستخدم ال std::set ؟ أعتقد إنها حتبقى مناسبة لما تريده.

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