من خلال الحلقة for ..
أنشئ حلقة تطبع لك جميع الأرقام من 1 إلى 10.
الإجابة كانت بهذا الشكل ..
و الناتج كما هو معروف لدي الجميع سيكون كالتالي ..
ولكن هذه النتيجة ليست ما أتطلع اليه فأنا أريد الناتج بهذا الشكل ..
ولكن الشرط الوحيد الذي أريد تطبيقه هو عدم وجود فاصلة بعد الرقم 10.
هل هذا الأمر ممكن أم مستحيل منطقيا من خلال الحلقة (for) فقط .. ؟
التعليقات
أحد الحلول:
int theLast;// نهيأ متغير لنحتفظ بقيمة العدد الأخير
for(int counter = 1; counter <= 9; counter++) {
system.out.print(counter + ", ");
theLast = counter;// يأخذ دائما آخر قيمة للمتغير counter
}
system.out.print(theLast+1);// وهنا يكفي أن نضيف له واحد لنحصل على النتيجة الكاملة
تعقيب:
لا حاجة لتعريف متغير جديد، فقط توسعة نطاق تعريف المتغير (عداد الحلقة) counter بتعريفه خارج الحلقة وطباعة قيمته خارج الحلقة بدون الفاصلة بعد تغيير الشرط إلى counter<=9 فالمتغير يحتفظ بآخر قيمة مخزنة به داخل نطاق تعريفه.
int counter = 1; for(; counter <= 9; counter++) { System.out.print(counter + ", "); } System.out.print(counter);
بالضبط، لقد رأيت تلك الطريقة ذات مرة وكنت أظن أنها لن يكون لديها أي فائدة فنسيتها كليا والآن لا أعتقد أنها ستختفي من ذاكرتي. شكراً :)
لهذا من أفضل وسائل التعليم إرفاق مُشكلة وحلها بالوسيلة المراد شرحها حتى تتضح وظيفتها وبالتالي ترتبط بالمشكلة لدى الدارس فيستدعيها حينما يُصادف مشكلة على شاكلتها.
ومن الجيد أنني مازلت أتذكر شيئاً من لغة Java :)
ومن الجيد أنني مازلت أتذكر شيئاً من لغة Java :)
أنا أيضاً، أكتب الكود أولا بالسي++ وأقوم بتجريبه ثم أحوله للغة أخرى، هكذا كنت أحل تمارين الباسكال في القسم :)
أفضل كود اتكتب , لكن برضو إنت مضطر إنك تكتب كود خارج أقواس الفور
لكن اللي محيرني هنا كام نقطة مش قادر استوعبها بناء علي معرفتي الغير جيدة
1 - ليه انت عرفت المتغير خارج اقواس الفور
2 - وليه طبعت قيمة المتغير بعد اقواس الفور
3 - اذاي اصلا ال 10 الأخيرة تم طباعتها علي الرغم من ان المفروض المتغير بيتحذف من الذاكرة بعد انتهاء الحلقة هل ده بسبب تعريف المتغير خارج اقواس الفور أم ماذااا ؟؟؟
ياريت توضحلي الموضوع في أسرع وقت ممكن وشكرا مقدما :)
هذا ما يُعرف بـ variable scope (نطاق تعريف المُتغيرات)[1].
قمت بتعريف المتغير خارج نطاق الحلقة لتوسعة نطاق تعريف المتغير ليشمل النطاق الخاص بالدالة main، بمعنى أخر تعريف المتغير يكون مرئي داخل نطاق الأقواس المعكوفة {} ففي حالة تعريف المتغير ضمن حلقة For يكون نطاق المتغير فقط داخل حلقة for بين الأقواس {} فقط، في حالة إخراج المتغير أصبح مرئي داخل الأقواس {} الخاصة بالدالة main لهذا استطعت استخدام القيمة المخزنة في المتغير.
[1]
إجابه أكثر من رائعه لأنه التسأول نتج من خلال معرفتي بأن المتغير داخل الأقواس في الحلقه لا يمكن إستخدامه خارجها علشان كده قولت بإستحالة تنفيذ الناتج منطقيا بالشكل الموضح في الأعلي من خلال الفور فقط بدون إستخدام أي متغيرات أو أكواد خارجية .
أما بخصوص عدم استخدام الشروط أو الخروج خارج نطاق الحقلة أو تعريف متغيرات إضافية فهذا سيتطلب منك البحث عن حلول بديله كاستخدام نوع البيانات char لطباعة الرموز مع بعض من الرياضيات لتتلاشى طباعة الرمز في نهاية الحلقة كالتالي:
for(int counter = 1; counter <= 10; counter = counter+1) { System.out.print(counter + ""+ (char)(44-(12*(1/(11-counter))))); }
الرقم 44 يعني الرمز , والرقم 32 يعني مسافة فارغة
في الحقيقة تعليقاتك دائما إبداعية وحلولك بالنسبالي عبارة عن فكرة مفيدة تثير فكرة أخري أكثر إفادة , أما بخصوصي فأنا مبتدئ هاوي أطمح للعمل في المجال البرمجي بشكل إحترافي كليا , و أما بخصوص التسأول فهو نتاج عدم التزامي بالشكل النهائي للناتج في التمارين الموجودة علي كل درس , محاولة مني في حصر كل الإحتمالات الممكنة للخروج بنتيجة مختلفة بطرق غير مألوفة نسبة لما درسته حتي الأن , وهذا أري مردوه الواضح في تقدمي في الكثير من الجوانب المنطقية والبرمجية ,
التساؤل مبني علي ملاحظتي انه عند طباعة الأرقام علي سطر واحد ومن ثم طباعة الفواصل ايضا مع الأرقام بعد كل رقم فإنه سيكون هناك فاصلة زيادة بعد الرقم عشرة وهذا ما لم أرغب به وبدا لي أن الأمر مستحيل منطقيا لأنه عند كل دورة في الحلقة سيتم طباعة الأرقام مع الفواصل بشكل متوازي ولن يتم الوصول للشكل المرغوب فهذا جعلني الوح بإستحالة تحقيق هذا الناتج منطقيا بإستخدام الحلقة فور فقط نظرا لطريقة كتابتها وطريقة عملها.
ومن هنا لابد أن يكون هناك ضرورة ملحه بإبتكار حلقات إخري تعمل بشكل مختلف , إضافة الي شروط وحيل رياضية اخري ليكمل كل عنصر الأخر للخروج بشكل نهائي متكامل للبرمجيات اعتمادا علي كل الأدوات والعناصر الموجودة وهذا ما اتضح لي من خلالكم أيها الرائعون ,
ومن هنا يأتي الإبتكار والإبداع .
ولما لا يستخدم الشروط المختصرة
for(int counter = 1; counter <= 10; counter = counter+1) {
System.out.print(counter + (counter < 10 ? ", " : ""));
}
- على ما أظن أنه سؤال في منهج دراسي يضيق الشروط ليبحث الطالب عن حلول أخرى ليصقل الطلاب مهارات حل المشكلات البرمجية، فشرط عدم استخدام الشروط شرط متعمدم حتى لا يلجأ الطالب لاستخدامه في الحل.
لا أرا ذالك ، السؤال هو طباعة من 1 إلى 10 وهذا سؤال يطرح للمبتدئين للتدريب على الحلقات
وأنت استخدمت char وكود الرمز وعمليات معقدة وهذا غير متوقع من مبتدأ
- هذا ما اعتقدته من تأكيد @mohamed_el_dawansy على عدم استخدام الشروط أو تعريف متغيرات أو حتى الطباعة خارج الحلقة.
ما كتبته مكافيء للكود التالي
for(int counter = 1; counter <= 10; counter = counter+1) {
String str;
if (counter < 10) {
str = ",";
} else {
str = "";
}
System.out.print(counter + str);
}
وهذه الطريقة تسمى الشروط المختصرة (short if) وصيغتها كالتالي
x = (cond ? valueIfCondIsTrue : valueIfCondIsFalse);
و أتمني ذكر مصادر عربية لدراسة أنواع البيانات بهذا الشكل مع شرح المعادلة او الحيلة الريااضية للخروج بهذا الناتج .
- إذا كنت تريد تنمية مهاراتك الرياضية والبرمجية إليك موقع
وما شابهه، وداخل المنتدى ستجد مشاراكات مفيدة في هذا المجال أيضاً.
- قصتي سيئة مع اللغة الإنجليزية، فقط احتكاكي بالمجال البرمجي هو ما جعل لغتي الإنجليزية تتحسن بعض الشي بالحث عن ترجمة كلمة ما ومحاولة فهم موضوع ما وهكذا هو حالي لم أعتمد على منهجية محددة أو دراسة أكاديمية، كانت لدي النية عدة مرات لتعلمها بشكل جيد ولكن لم أجد الوقت الكاف بعد للبدأ، أأمل أن يجيبك الأعضاء ذوي الخبرة في اللغة الإنجليزية عن أفضل الأسالب لتعلمها بشكل جيد وبدون عشوائية.
طيب ليه المتغير كتب 10 مع ان الشرط الموجود داخل الحلقه 9 بس
هل لأن الحلقة نفذت شرطها ووقفت عند المتغير لما بقت قيمته 10 , وبسبب ان المتغير متعرف خارج الحلقه أمكن طباعته بكود خارج الحلقة فطبع الرقم 10 اللي هو أخر قيمة للمتغير
لكن لو الكلام ده صحيح ليه الذاكرة زادت للرقم 10 من الأساس كان ممكن تكون أخر قيمة للمتغير 9 بس وفقا للشرط الموضوع ولا العملية دي بسبب شرط الزياده والنقصان داخل الحلقه وهل لو بسبب شرط الزياده والنقصان ليه مش بيتم إيقاف الشرط مباشرة عند الوصول للرقم 9 مثلا ليه برضو تم تخطي قيمة الشرط الموضوع , هل ده ضرورة منطقية لعمل الحلقة وايقافها أم ماذا ..
أولا لو تم الإجابة علي التسأولات دي موضوع الحلقات بالنسبالي هينتهي بشكل نهائي , وأسف لطول السؤال وأتمني الإجابة بصدر رحب وهذا ما نعتقده منكم ..
اتوقع ان هذا الحل ليس هو المراد :
لانك لا تستخدم حلقة الloop فقط
هو يسأل عن امكانية تنفيذة بحلقة الloop فقط
اى بداخل الاقواس
#include <iostream>
using namespace std;
int main() {
for(int x = 1; x <= 10; x++) {
cout << x;
if(x < 10)
cout << ", ";
}
}
وهذا اختصار صغير لكود @عبد الرحمن أحمد :)
الكود ده كان فيه خطأ انه لابد انك تدي للمتغير الجديد قيمة اولية زي كده int theLast = 0;
ومشكلة اخري صغيرة ان الإس في كلمة سيستم لابد تكون كابتل لأن الجافا حساسه لحالة الحروف
الكود حقق النتيجة لكن ما حققش المطلوب داخل الحلقة (for) فقط واحتاج انك تعمل متغير جديد
علي كل حال مشاركة ممتعه وشكرا جزيلا
لابد انك تدي للمتغير الجديد قيمة اولية زي كده int theLast = 0;
لا، ليس من الضروري اعطاؤه قيمة أولية لأننا لا نحتاج لذلك، فقط متغير يحتفظ بآخر قيمة معطاة له.
> الكود حقق النتيجة لكن ما حققش المطلوب داخل الحلقة (for) فقط.
لقد فعل ذلك انظر للكود فوق، دعني أعيد صياغته لك لتفهمه بالجافا
for(int counter = 1; counter <= 10; counter++) {
System.out.print(counter);
if(x < 10) {
System.out.print(", ");
}
}
يا رجل في الكود اللي انتا كتبته الأول بالجافا لازم تحط قيمة اوليه للمتغير الإنتجر , الكلام اللي انتا بتقوله ده في حالة ان المتغير سترينج مش لابد تديله قيمة أوليه انما علي حد معرفتي ان الإنتجر لازم يبدء بقيمة أولية 0 او واحد الصفر في حالة الجمع والواحد في حالة الضرب والله أعلم لو كلامي غلط ياريت حدد يصححلي ضروري
_____________________
انما ردي بالنسبة لعدم تحقيق الشرط المطلوب ,انك المفروض لا تضيف اي شرط للحلقة فور او اي متغير جديد لو حاولت تفهم دوافع التسأول عندي هتجاوب بشكل محدد من خلال أقواس الفور
بخصوص القيمة الأولية، كما أخبرتك لا تحتاجها جرب و سترى، القيمة الأولية تحتاجها في حالات أخرى غير حالتك هذه..
أمّا بخصوص أنّ الحل يجب أن يكون بحلقة loop فقط فأنا لا أعرف.. أعطيتك كل ما عندي فأنا لازلت مبتدأ، لكن لا أعتقد أنّ هناك حل آخر فهذه هي البرمجة يجب أن تحقق النتيجة بأبسط مالديك.
أنا اديته قيمه 200 وبرضو طلع الناتج صحيح لأن القيمة بتتمسح فعلا من الذاكرة ولمتغير بياخد أخر قيمة ليه لكن لابد إنه يبدأ بقيمه أوليه حتي لو كانت مليون وبعتذر عن قصة الصفر و الواحد لأنه فعلا الجمع والطرح اللي اتكلمت عنهم بيبقو في حالات تانية غير الحالة اللي بنحاول نفسرها
// c++
auto max = 10;
for(auto i = 1; i < max + 1; ++i)
{
printf("%d", i);
if(i < max)
printf(",");
}
// Out
// 1,2,3,4,5,6,7,8,9,10
هي تشبه var في جافاسكربت يعني اعتبادك على كتابة auto باستمرار سيكون أسرع ولا تلقائي أكثر من كتابة كل نوع بشكل مختلف ولولا فائدتها لما أضيفت إلى تطويرات اللغة.
على فرض تريد تعريف عدد كبير من المتغيرات وذات أنواع كثيرة مختلفة فأيهما أيسر أن تضع لكل متغير نوعه الخاص أم كلها auto وتترك تحديد المتغير للمترجم، وهي مفيدة أيضا للمتغيرات المحلية وقصيرة المدى.
يعني الأمر متعلق بتسريع الكتابة وتبسيط الكود وتخفيف التنوع للتركيز على ما هو اهم.
for (int counter = 1; counter <= 10; counter = counter + 1) {
if (counter != 10)
System.out.print(counter + ",");
else
System.out.print(counter);
}