اذهب إلى المحتوى

شرف الدين حفني

الأعضاء
  • المساهمات

    1690
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    2

كل منشورات العضو شرف الدين حفني

  1. ال foreach هي نفسها كإستخدام الiterator ولكن بطريقة أسهل أو كما يُقال syntactic sugar حيث أن الforeach تقوم بإستخدام الiterator بشكل مخفي عن المستخدم بغرض التسهيل, فمثلاً الشفرة for (String i : list) { System.out.println(i); } أسهل من إستخدام الشفرة Iterator it=list.iterator(); while (it.hasNext()){ System.out.println(it.next()); } ولكن يجب التنويه أن إستخدام الiterator يعطيك تحكم أكبر قد تحتاجه حيث ﻻ يمكنك تنفيذ بعض الوظائف بالforeach بسبب عدم وجود تحكم كامل , فمثلاً إن أردنا حذف عنصر من المجموعة ﻻ يمكننا تحقيق ذلك بإستخدام الforeach بينما يعطينا الiterator القابلية لتحقيق ذلك الغرض for (String i : list) { list.remove(i); // سيتم إلقاء خطأ هنا } بينما بإستخدام الiterator Iterator it=list.iterator(); while (it.hasNext()){ it.remove(); // تعمل الشفرة بشكل سليم بدون إلقاء أيةِ أخطاء }
  2. قبل أن أشرح ماهي الخدمات المصغرة (microservices) دعني أشرح لك النظام التقليدي في بناء الأنظمة وهو نظام الصخرة الضخمة (monoliths) في التطبيقات التقليدية يكون النظام كله مرفوع على خادم ويكون غالباً هذا النظام مبني بنفس الشفرة المصدرية , عندما يريد أحد أفراد الفريق إضافة خاصية جديدة , يقوم بإضافة تلك الخاصية إلى النظام, لماذا قد يُسبب هذا مشكلة؟ قد يسبب ذلك مشكلة بسبب أن مع الوقت عندما ينمو التطبيق ويكبر يزداد حجمه بشكل كبير ويصبح من الصعب التعديل على المميزات القديمة في التطبيق أو إضافة مميزات جديدة بسبب إعتماد الخواص كلها على بعض لأنها كلها مكتوبة في نفس النظام الضخم , بالإضافة إلى مشكلة الscalability أو قابلية التوسع, فمع زيادة مستخدمين التطبيق يزداد الضغط على الخادم مما يؤدي إلى مشاكل في الأداء بالإضافة إلى ظهور مشاكل أخرى في مرحة الإختبار لأن كل أجزاء النظام معتمدة على بعضها البعض مما يزيد التعقيد عند الإختبار حيث من الممكن توقع مشكلة في أى جزأ من النظام . على الجانب الأخر يوجد نظام الmicroservices أو الخدمات المصغرة, كما شبهنا بالأعلى النظام التقليدي بالصخرة الكبيرة, يمكننا تشبيه هذا النظام بتفتيت تلك الصخرة إلى صخور أصغر منها فبدلاً من إنشاء نظام واحد كبير ملئ بالخواص والمميزات, نقوم بإنشاء عدد كبير من الأنظمة الصغيرة ويتواصل المستخدم معهم مما يُسهل التعديل على خواص النظام نظراً لأن كل نظام منهم قائم على ذاته ﻻ يعتمد على باقي الأنظمة بالإضافة إلى سهولة إختبار النظام, حيث أنك تحتاج لإختبار كل نظام على حدة دون الإعتماد على باقى النظم , فإن ظهر خطأ في نظام فيكون ذلك الخطأ بسبب النظام نفسه, وليس بسبب خطأ في نظام أخر معتمد عليه, فكما قلنا في الخدمات المصغرة يكون كل نظام ﻻ يعتمد على الأخر وبوجه عام نقوم بإستخدام النظام التقليدي في حالة: ﻻ يوجد عدد كبير من المطورين الذين يعملون على نفس المشروع( لدينا نفس قاعدة الكودcode base) ﻻ يوجد عدد خارق من المستخدمين لهذا النظام, حيث أنه يستهدف شريحة معين ونقوم بإستخدام نظام الخدمات المصغرة في حالة تتوقع عدد كبير من المطورين للعمل على نفس المشروع ولفترات طويلة تتوقع عدد كبير من المستخدمين
  3. مفهوم الإنعكاس (reflection) في لغة جافا يُعبر عن وصف وفحص الشفرة البرمجية , مثال على ذلك إن كان لديك كائن من نوع ما وتريد إستدعاء دالة ما في هذا الكائن ولكن هذا الكائن تم تمريره لك دون معرفة نوعه , بسبب أن جافا من النوع static typed ﻻ يمكنك مناداة دوال هذا الكائن, لكن بمساعدة الإنعكاس يمكنك فعل شئ مثل ذلك Method function = anon.getClass().getMethod("someFunction", null); function.invoke(anon, null); وبوجهٍ عام يتم إستخدام الإنعكاس في مجالات كثيرة, مثل بيئات التطوير المتكاملة (ides) مثل الnetbeans, eclipse حتى يكون قادر على معرفة الدوال والكائنات الموجودة في النظام لديك وعندما نقول أنه يساعد على تحليل الشفرة البرمجية, فإننا نعني ذلك حقاً, حيث يمكنك كشف أي قطعة في الكائن حتي الحقول والدوال الخاصةprivate وكما هو واضح من الإسم "الإنعكاس" فأنه يجعلك قادراً فقط على فحص الشفرة وليس تعديلها , أكثر ما يمكنك فعله من أمور التعديل هو أن تقوم بتغيير إمكانية الوصول للحقول في الكائن, مثلاً تغيير أحد الحقول من خاص إلى عام(private/public)
  4. الwrapper class يٌقصد بهِ class يقوم بتغليف البيانات البدائية (primitive data) والمقصود بها (int, byte, short, long, float, double, boolean, and char) ويقوم الwrapper class عند تغليف تلك البيانات بالسماح لنا بالتعامل معا على أنها كائنات مما يتيح لنا عدد من المميزات مثل: تمرير البيانات بالمرجعية بدلاً من القيمة(pass by reference ) حيث لا يمكننا عمل ذلك مع البيانات البدائية public void addOne(int a){ a+=5; } public void addOneWrapper(Integer a){ a=new Integer(a.intValue()+1); } public void main(){ int number=5; Integer wrapper=new Integer(number); addOne(number); addOneWrapper(wrapper); System.out.println(number);//////prints 5, no change because it is passed by value System.out.println(wrapper.intValue());///////prints 6 because it is passed by reference } الكﻻسات في المجموعة java.util تتعامل مع الكائنات وليس مع البيانات البدائية هياكل البيانات في إطار عمل collection مثل arrayList, vector يتعاملو فقط مع الكائنات وليس مع البيانات البدائية
  5. دالة البناء يتم تمثيلها كالدالة العادية ولكن يكون إسمها مثل إسم الclass الذي يحتويها بالإضافة إلى اننا نحذف نوع الإرجاع للدالة , مثلا void tomato ستكون tomato المتغير الثابت يمكنك تمثيله عن طريق كتابة عبارة read only بجانبه الكﻻس المجرد: يوجد طريقتان, الأولى: أن تقوم بكتابة إسم الclass بخط مائل , الذي يدعى italic الطريقة الثانية لتمثيل الclassالمحرد هي أن تقوم بكتابة كلمة abstract بجانب إسم الclass شكل الأسهم يكون مثل ما هو موضح في الصورة
  6. في الحقيقة يوجد خوارزمية بهذا الإسم بالإضافة إلى هيكل بيانات يحمل نفس الإسم, بالنسبة إلى هيكل البيانات شجرة البحث الثنائية: هو عبارة عن نوع من الأشجار الثنائية ولك يشترط أن يكون كل العناصر على يمين العنصر أكبر منه , وكل ماهو على يساره أصغر منه, كم هو واضح بالأدنى tree:{ root:rootElm } rootElm{ value:10, right:a, left:b } a{ value:15, right:a2, left:b2 } b{ value:5, right:ab3, left:b3 } وكل عنصر من العناصر على اليسار واليمين بالمثل اكبر مما على يساره وأصغر مما على يمينه. أما بالنسبة للخوارزميات فيوجد خوارزمية اسمها (خوارزمية البحث الثنائي) تُستخدم للبحث عن العناصر والتي تعتمد فكرتها على أن تكون مجموعة العناصر المُدخلة مُرتبة, فتقوم الخوارزمية بالنظر إلى العنصر بالمنتصف, إن كان العنصر المطلوب أكبر منه نبحث في الجزأ الأيمن للمصفوفة, إن كان أصغر نبحث في الجزأ الأيسر, ونقوم بعمل نفس التكنيك مع كل نصف منهما حتى نعصر على العنصر المطلوب x:7 input{1,3,4,5,7,8,10} mid=5<7 new input{7810} ......
  7. oltp إختصار (Online transaction processing) وتعبر عن نظام قواعد البيانات الذي يركز بشكل أساسي علي إدخال البيانات وإظهارها دون تحليل أو إستخراج بيانات مخبأة , مثلاً ماكينات الATM هي نوع من تلك الأنظمة حيث أنها تقوم بقراءة رقم الحساب وإظهار بياناته المالية ومن ثم التعديل عليها, ﻻ يوجد تحليل أو بيانات مخبأة olap إختصار ل Online Analytical Processing وتعبر عن نظام قواعد البيانات المعقد أكثر والذي بشكل أساسي يصب تركيزه على تحليل بيانات موجودة بالفعل وإستخراج بيانات جديدة منها, مثلاً تطبيق spotify يقوم بإستخدام هذا النوع من الأنظمة من أجل تحديد الموسيقى المناسبة لكل مستخدم عن طريق تحليل بياناته وسجلاته, وغالبا الolap ﻻ يهتم كثيراً بإدخال بيانات بقدر إهتمامه بفحص البيانات القديمة والتعدين عليها
  8. الfloat معرفة حسب معايير IEEE-754 والتي تنص علي أن يتم حجز عدد من الbits من أجل الرقم وعدد من الbits من أجل الأس , حيث يتم كتابة الرقم علي الصورة الأتية 10.25=1025e-2 حيث e-2 تعني 10 مرفوعة للقوة سالب 2 بينما في الnumeric أو التي تسمى Fixed-point Decimals (النقطة الثابتة العشرية) يتم حجز عدد الbits المستخدمة في كلاً من الرقم قبل العﻻمة العشرية والرقم بعد العﻻمة العشرية من قبل تعيين قيمتهم حسناً, ما الفرق إذاً؟ الfloat أسرع في حسابه ولكن دقته أقل, وبالمناسبة هذ نفس النوع الذي يتم إستخدامه في الc/c++ المكاتب القياسية, فيمكنك تجربة الكود الأتي float x = 0.1; float y = 0.2; printf("x+y = %.20f\n", x+y); printf("0.3 = %.20f\n", 0.3); وعند النظر إلى الناتج نجد أ،: الناتج المتوقع: x+y = 0.300000 0.3 = 0.300000 بينما الناتج الحقيقي: x+y = 0.30000001192092895508 0.3 = 0.29999999999999998890 بينما في الnumeric تكون دقته عالية ولكن يكون أبطأ في حسابه من الfloat وبوجه عام فإن الfloat دقته تكون كافية ومرضية إلا في حالة أن تكون تتعامل مع بيانات حساسة مثل الحسابات العلمية أو حسابات البنوك
  9. الكتابة العلمية "scientific notation" تعبر عن طريقة لكتابة الأرقام ذات الأصفار الكثيرة بشكل مبسط وسهل, فمثلاً لو سألنا كم ذرة موجودة في جسم الإنسان؟ الناتج سيكون مكون من 7 وبجانبه 27 صفراً مما يبدوا سيئاً عند الكتابة ويسبب التشتت أثناء القراءة 7,000,000,000,000,000,000,000,000,000 كم تبلغ كتلة كل ذرة من تلك الذرات؟ 000000000000000000000000001 g كما تﻻحظ من الصعب قراءة تلك الأرقام, الحل فالكتابة العلمية, فكما تﻻحظ إن 70 يمكن كتابتها على هيئة 7*10 , 700 يمكن كتابتها على هيئة 7*100 أو 7 * 10 ^2 , إذا من الممكن أن نقول أن جسم الإنسان به ذرات عددها 7*10 ^27 وكل ذرة منهم لديها كتلة قيمتها 10^-27 g , ذلك تسهيلاً لقراءة الرقم, وفي البرمجة يمكن كتابة الكتابة العلمية عن طريق رمز e, مثلاً 7*10 ^27 يمكن كتابتها على النحو الأتي: 10e27 , وبالنسبة لكتلة الذرات يمكن كتابتها على النحو الأتي 1e-27
  10. هذا الخطأ يظهر لك بسبب قيامك بتعريف الحالة(state) بهذا الشكل const [form,setForm]=useState({}) إن ﻻحظت ستجد أن الكائن الخاص بحالة الform عبارة عن كائن فارغ, فبالتالي تكون قيمة خاصية value في الinput تساوي undefined أي يتم حدوث الrender بهذا الشكل <input value={undefined} name="name" onChange={(e)=>setForm({...form,name:e.target.value})} /> وبما أن القيمة غير معرفة فيتم معاملة الinput على أنه uncontrolled, وعندما يتم كتابة شئ ما في الحقل تقوم دالة onChange بإسناد قيمة إلى الحقل name في الكائن form ليصبح بهذا الشكل { name:"بعض الكﻻم" } فبالتالي تصبح قيمة الخاصية value تساوي "بعض الكﻻم" أي لم تعد غير معرفة, فبالتالي يصبح الinput في حالةcontrolled مما يؤدي إلى ظهور رسالة الخطأ لحل المشكلة يمكنك فعل أحد الأمرين إما أن تقوم بإعطاء قيمة مبدأية للحقل name const [form,setForm]=useState({ name:"" }) أو أن تقوم بإعطاء قيمة مبدأية للخاصية value في حالة كان الحقل name غير معرف <input value={form.name || ""}/>
  11. هل سبق لك تعلم شئ في مجال البرمجة ام تلك أول مرة؟
  12. بروتوكول الhttp يتضمن إرسال العميل بطلب , والرد عليه من قبل الخادم ومن ثم يتم إغﻻق الإتصال, ﻻ يمكنك إرسال أكثر من رد لنفس الطلب, وهذا هو ما يسبب ذلك الخطأ لديك أنك قمت بمحاولة إرسال أكثر من رد لنفس العميل حيث في السطر res.status(404).send("err") بعد تنفيذ ذلك السطر أعتقد أنك تظن بأن البرنامج سيقف ولن يتم إرسال ردود أخرى, ولكن ال node ﻻ تعمل بذلك الطريقة فبعد ذلك السطر سيكمل البرنامج تنفيذ باقي الشيفرة حتى يصل هنا user.save() .then(()=>res.json("user created")) وهنا يكون ثاني رد يحاول الخادم إرساله لنفس الطلب, ما الحل؟ الحل هو إيقاف الدالة بعد إرسال الرد الأول وذلك عن طريق وضع كلمة return التي بدورها ستقوم بإيقاف الدالة وإرجاع قيمة , كالتالي if(req.body.user.email==undefined){ res.status(404).send("err") return } بهذا الشكل نضمن عدم إرسال اكثر من رد من الخادم لنفس الطلب
  13. يجب أولاً أن تعلم بوجود ما يسمى بال Scalar types والذي يعني نوع بيانات يحمل قيمة واحدة مثل Integer, string, float ,boolean عكسه لدينا الcompound types مما يعني نوع بيانات يحمل أكثر من قيمة مثل array, map , حسناً , نرجع لسؤالك ماهو الstrict types? كما تعلم على الرغم من توافر إمكانية تعريفك للمتغير كنوع معين مثل function test(int $a, float $b) : int { return $a + $b; } test("sharaf",4) هنا قمنا بتعريف الparameters التي تمر بالدالة test أنهم من النوع int & float على الرغم من ذلك قمنا بتمرير parameters من النوع string, int ومع ذلك سيعمل البرنامج دون أن يلقي خطأ, فائدة الstrict decleration أن يقوم بإلقاء خطأ عند محاولة تمرير بيانات من نوع غير المطلوب, وذلك لضمان أن يقوم المبرمج بكتابة برنامج منظم بشكل أكبر وأسهل للقراءة وأقل عرضة للbugs , فمثلاً الكود بالأعلى إن قمنا بتشغيله عند تفعيل الوضع الصارم(strict declaration) سيقوم بإلقاء خطأ Fatal error: Uncaught TypeError
  14. يمكنك تخزين العناصر في حالة (state) const [list,setLits] = useState([//ضع هنا قيمة القائمة الإبتدائية//]); وعندما تريد أن تضيف عنصر ما تقم فقط بتعديل هذه القائمة التي في الحالة(state) const addItem = (name)=>{ setList(list.concat(name)) }
  15. عملية projection يُقصد بها إختيار خواص معينة من العﻻقة مما ينشئ لنا عﻻقة جديدة , مثلا لدينا العﻻقات أو الجداول الأتية user(id,name,age) post(id,user_id,title) إن قمنا بإختيار الخاصية name, id من العﻻقة user هذا يُسمى projection لأننا قمنا بإختيار خواص معينة من العﻻقة , ويمكن تمثيله بالجملة الإستعﻻمية الأتية select id, name from user ويمكن للprojection أن يكون معقداً أكثر , مثلاً إن أردنا إختيار أسامى المنشورات التي قام المستخدم بنشرها سنحتاج أن نختار الtitle الخاص بالمنتجات التي لديها خاصية user_id مساوية لقيمة id الخاصة بالمستخدم, كما في الجملة التالية select title from post inner join user on user.id = post.user_id وبوجه عام عملية إستخراج عﻻقة من عﻻقة أخرى عن طريق إختيار خواص محددة يسمى projection
  16. يمكنك إستخدام برنامج unzip للقيام بهذا الأمر بإضافة العلم -l قم بتثبيت برنامج unzip sudo apt-get install unzip قم بإستخدامه مع مراعاة إرفاق العلم -l الذي يمكنك من عرض المكونات دون كتابتها إلى المساحة التخزينية unzip -l "your file name" لفتح الملفات في شاشة منبثقة بغرض التنظيم إستخدم برنامج less , عن طريق تحويل الناتج عن طريق الpipe unzip -l "your file" | less لفتح الملفات نفسها ليس فقط المجلدات إستخدم العلم -p unzip -p "your file name" | less
  17. من الممكن تخزينها في الكعكات cookies او المساحة المحلية localStorage, لكل منهما مميزات وعيوب ويمكن المقارنة بينهما كالتالي: هجوم ال csrf : وهو نوع من الهجوم حيث يقوم المخترق بإستخدام كعكاتك في طلب مزيف حتي يحصل على المعلومات التي ليس له صﻻحية عليها, هذا الهجوم من الممكن تنفيذه من الكعكات فهنا نقطة قوة تحسب للمساحة المحلية, ولكن على الرغم من ذلك لم يعد هذا تهديداً كبيراً حيث إن أغلب أطر العمل يقومون بالحماية من هذا التهديد بشكل تلقائى بالإضافة لإمكانية وضع الxsrf-token في الطلب لضمان أنه من مصدر أمن { "iss": "http://hsoub.com", "exp": 1300819380, "xsrfToken": "xxxxxx-xxxxxxx-xxxxxxx-xxxxxx" } هجوم ال xss: فإن الlocalStorage معرضة أكثر لهذا الهجوم, وهو هجوم عبارة عن حقن الموقع بشفرة جافاسكريبت للحصول على معلومات , ولكن الكعكات عند وضع إشارة ال http-only, secure, same-site=strictسيكون من شبه المستحيل تنفيذ الحقن مقدار البيانات الممكن حملها: حيث أن للكعكات حد أقصى من البيانات 4 كيلو بايت, لا يمكن حمل أكثر من هذا الحجم , بينما المساحة المحلية تستطيع تحمل 5 ميجا بايت والذي يعد فرق شاسع
  18. كلا المعاملان وظيفتهم المقارنة, الفرق أن ال=== تقوم بمقارنة القيمة ونوع البيانات , بينما == تقوم بمقارنة القيمة فقط فمثلا 0=="0" تساوي true لأن ال== تقارن القيمة فقط , وكلاً منهم قيمتها صفراً بينما 0==="0" تساوي false لأن ال=== تقارن القيمة ونوع البيانات, وهنا نوع البيانات مختلف, احدهما نوعه رقم والأخر سلسلة نصية/ حرف والجدول التالي يوضح بعض الأشياء التي قد تسبب الحيرة للمبرمج أثناء التعامل مع هذان المعاملان 0 == false // حقيقي, لأن قيمة ال"غير حقيقي" تساوي صفراً 0 === false // غير حقيقي, لأن على الرغم أن قيمة ال"غير حقيقي" تساوي صفراً , إلا أن نوعها ليس رقم وإنما Boolean 1 == "1" // حقيقي, لأ، كلاً منهما قيمته ب1 على الرغم من إختﻻف نوع البيانات 1 === "1" // غير حقيقي لأننا نستخدم علامة المساواة الثﻻثية والتي تهتم بنوع البيانات, فعلى الرغم أن كلاً منهم قيمته 1 إﻻ أن كلاً منهما له نوع بيانات مختلف null == undefined // حقيقي لأن لهم نفس القيمة null === undefined // غير حقيقي لأن عﻻمة المساواة الثلاثية تتوجب أن يكون لهم نفس نوع البيانات '0' == false // حقيقي لأن عﻻمة المساواة الثنائية تهتم بالقيمة فقط , وقيمة ال"غير حقيقي" بصفراً '0' === false // غير حقيقي, لأن عﻻمة المساواة الثﻻثية تهتم بنوع البيانات, وهنا النوع مختلف
  19. ال body-parser لم يتم إهماله (deprecated) إنما فقط لم يعد بإمكانك إستخدام الconstructor في الmiddleware app.use(bodyParser()) وإنما يجب تحديد الدالة التي تريدها من ال body-parser والتي تحدده حسب نوعية البيانات التي تريد أن يحدث لها parsing مثلاً إن أردت قراءة البيانات كنصوص app.use(bodyParser.text()) إن أردت قراءة البيانات كملف json app.use(bodyParser.json()) وبنفس النمط على باقي أنواع البيانات, نقوم بإستخدام الدالة المناسبة لها
  20. ذلك لأنك تقوم برفع ملفات رى أكت دون أن تقوم بعمل build , يجب أن تقوم بعمل عملية build حتى تستطيع من رفع الملفات على git-hub ويمكنك إتباع الخطوات الأتية لرفع مشروعك على github-pages تأكد من تثبيت كلاً من node, npm, git على حاسوبك تثبيت gh-pages ك dev-dependency npm install gh-pages --save-dev ضع خاصية الhomepage في ملف الpackage.json { ......, homepage:"http://{اسم المستخدم الخاص بك}.github.io/إسم المستودع" } ضع scripts تقوم بعملية الbuild بإستخدام الnodeوال gh-pages حتي يتم نشر تطبيقك على الموقع "scripts": { //... "predeploy": "npm run build", "deploy": "gh-pages -d build" } بالطبع تلك الscripts سيتم كتابتها فى الpackage.json قم بإنشاء مستودع على git hub git init git remote add origin {رابط المستودع} والأن قم بعملية deploy npm run deploy مبروك تم رفع التطبيق ستجده في فرع gh-pages في github , بالإضافة لذلك ستجد التطبيق يعمل بشكل حي من خﻻل الرابط الذي وضعته في الhomepage في ملف package.json
  21. هذا لأن الأمر sudo يعمل مع البرامج , الأمر cd ليس برنامج إنما هوو أمر داخلى للصدفية الخاصة بلينكس shell built-in الحل من أجل الولوج للمسار أن تقوم بإستخدام الterminal كمستخدم جذرى root user, عن طريق الأمر sudo -i سيقوم بطلب كلمة المرور منك وستقوم بإدخالها ومن ثم يمكنك الولوج إلى المسار المرغوب بما أنك مستخدم جذرى
  22. كلاً منهما لها نفس الوظيفة لا يوجد فرق في الوظيفة , فقط الفرق في طريقة الكتابة حيث أن async/await تجعل الكود منظم أكثر , ولكن للإثنان نفس الوظيف , فمثلاً هذا الكود بالpromisies const getData=()=>{ fetch(url) .then(data=> doSomething(data)); } يوازيه ذلك الكود const getData=async ()=>{ const data=await fetch(url) doSomething(data) }
  23. سأقوم بكتابة بعض الأسألة لك وسأكتب خطوات الحل, ولكن ﻻ تنظر للحل إلا بعد محاولة حلها بنفسك حتى تستفيد قم بكتابة دالة تستقبل مصفوفة من المستخدم وتقوم بطباعة جميع عناصر المصفوفة ماعدا العنصر رقم 3 قم بكتابة دالة تستقبل نصاً من المستخدم وتقوم بطباعة كل حرف على حدا قم بكتابة دالة تستقبل مصفوفة من المستخدم وتقوم بإيجااد أكبر عنصر قم بكتابة برنامج تستقبل مصفوفة وتقوم بإيجاد عنصر معين ///////////////////////////////////////////////////////////الحل////////////////////////////////////////////////////////////////////////////////////////////////// public void test(int arr[]){ for(int i=0;i<arr.length;i++){ if(i==3) continue; System.out.println(arr[i]) } } public void test(String s){ for(int i=0;i<s.length();i++) { System.out.println(s.charAt(i)); } } public int test(int arr[]){ int max=arr[0]; for(int i=0;i<arr.length;i++){ if(arr[0]>max) max=arr[0]; } return max; } public int find(int arr[],int element){ int index=0; while(index<arr.length){ if(arr[index]==element) return arr[index]; } return -1; }
×
×
  • أضف...