من فضلك هل يمكنني الحصول على تلميح حيث التركيز على التنسيق ؟ [مغلقة]

StackOverflow https://stackoverflow.com/questions/698973

  •  22-08-2019
  •  | 
  •  

سؤال

ويفترض البرنامج لحساب عدد من الحجج ، تكرار عبر قائمة من الحجج ، لكل حجة تحويل الحجة إلى عدد صحيح و نسخ إلى صفيف ، تكرار عبر مجموعة من العناصر ، إضافة قيمة كل واحدة إلى متغير (هذا يحسب مجموع العناصر) ، وطباعة المجموع.لن يكون هناك أكثر من 15 الحجج.حتى الآن لدي:

int sumofA (int sizeofA, int x, int y){  
  int i = sizeofA;  
   if (i <= 15){  
      int z = x + y;  
      return z;  
   }  
}  

int main (int argc, char*argv[]){    
   int sizeofA = argc - 1;  
   int i = 1;  
   while (i <= sizeofA){  
      int x = GetInt (argc, argv, i);  
      i = i + 1;  
      int y = GetInt (argc, argv, i);     
      printf ("%d\n", sumofA (sizeofA, x, y));
   }  
   return 0;  
}  

حسنا, الآن (عندما تعطى ثلاث حجج أخرى من ./أ) طباعة مجموع أول حجة والحجة الثانية...ثم الثاني والثالث ثم قيمة الوسيطة الثالثة.لماذا ؟

هنا هو رمز GetInt (يجب استخدام هذا):

int GetInt (int argc, char * argv[], int i) {  
   if (i < 0 || i >= argc) return 0;  
   return atoi(argv[i]);  
}  

هل أنا بحاجة إلى الذهاب من خلال تعيين كل حجة إلى عدد صحيح (ex. int z = GetInt (argc, argv, i + 2) )?

هل كانت مفيدة؟

المحلول

وهناك زوجين من هذه المشكلة هنا:

  • أنا لم يتم تعريف في sumofA ، وذلك مقارنة مع العائد السلوك غير معرف.
  • إذا كان i >= 15 ، ثم إنه من غير الواضح ما sumofA العودة.
  • يمكنك العودة داخل حلقة ؛ بالتأكيد هذا ليس ما تريد.
  • التعليمات البرمجية الخاصة بك هو في الواقع لا تخزين أي شيء في مجموعة A.

يرجى ترجمة التعليمات البرمجية الخاصة بك مع جميع تحذير-الأعلام على (دول مجلس التعاون الخليجي:-الجدار -Werror -متحذلق) ، وتأكد من هناك لا تحذيرات عند التعليمات البرمجية برمجيا.

لاحظ أن المتغير حجم هو غير الضرورية:استخدام بينما (أنا < argc).

تحرير: الآن بعد أن قمت بإضافة رمز من GetInt, استبدال

GetInt (argc, argv, i);

مع

atoi(argv[i]);

لا يوجد أي استخدام GetInt, لذا يمكنك إزالته تماما.

وأخيرا:في السؤال ذكر تخزين الأرقام في صفيف ثم جمع لهم.هل تريد أن تفعل ذلك ، أو تحتاج أن تفعل ذلك (بسبب بعض الواجب؟) لأنه ليس من الضروري:ببساطة إضافة نتيجة جميع المكالمات إلى atoi.مجموعة A ثم لزوم لها.

تحرير 2: أرى أنك ثابت رمز في بعض الأماكن.التعليمات البرمجية الخاصة بك حاليا (23:31 CEST) يضيف الحجة الأولى إلى كل من الحجج على حدة ويطبع لهم.أنت لست تماما بعد.حظا سعيدا!

نصائح أخرى

والمشكلة هي هنا:

 int x = GetInt (argc, argv, 1);
 int y = GetInt (argc, argv, i);

وكما تذهب من خلال حلقة أول مرة، ما هو أنا، وماذا طباعة؟ وماذا عن المرة الثانية تذهب من خلال الحلقة؟

وبالنسبة للمبتدئين، كنت ستعود 0 بعد التكرار الأول من حلقة الخاص بك.

ومنذ كنت تريد تنسيق المساعدة ...

أولا، C لديه المزيد من عوامل التعيين من مجرد =، وهذه هي كبيرة لأشياء مثل x = x + 1. معظم اللغات، وشملت C، توفر مشغل +=، والتي تبدو مثل هذا: x += 1. أن يفعل الشيء نفسه x = x + 1، وأجمل. السكر Syntaxtic، ولكن السكر لذيذ.

وبينما نحن في ذلك، C والعديد من اللغات الأخرى توفر حالة خاصة بالنسبة لل+= 1 - المشغل ++ من الذي C ++ يحصل على اسمها. ذلك حقا، x = x + 1 يمكن إعادة كتابة كما x++ مع تأثير نفسه بالضبط . ولكن لاحظ أن هناك فرقا كبيرا بين x++ و++x، ولكن هذا لا يهم حاليا. في الوقت الراهن، واستخدام أي واحد تريد، وتأكد من وضعه على خط منتجاتها من تلقاء نفسه حتى تتعلم الفرق بين x++ و++x.

وإذا وجدت لديك متغير كنت تستخدم مرة واحدة، لا يستخدمونه. بدلا من هذا:

int sizeofA = argc - 1;
...
while (i <= sizeofA){
  ...
  printf ("%d\n", sumofA (sizeofA, x, y));
}

وجرب هذا:

...
while (i <= argc - 1){
  ...
  printf ("%d\n", sumofA (argc - 1, x, y));
}

وأو (ربما أفضل):

...
while (i < argc){
  ...
  printf ("%d\n", sumofA (argc - 1, x, y));
}

والثالث باتجاه آخر، لا يجب أن يمر على نحو أعمى أن قائمة الحجج الخاص بك كامل، إلا أن الحجة التي تريد تحويلها في هذا الوقت الحالي، ولكن هذا موضوع آخر، وأنا افترض أنك لا تستطيع تغيير GetInt(). هذا يبدو وكأنه معركة ليوم آخر.

و(الرابع من، لماذا هذا السؤال مجتمع المعرفة؟)

وخامسا، وأعتقد أن المنطق الخاص هو خارج - إذا كنت تبدأ في 1، وأنا لا أعتقد أنك تريد إيقاف 1 قبل نهاية القائمة. ولكن هذا خطأ بسيط خارج من جانب واحد ويمكنك تحديد ذلك في وقت لاحق عندما تعلم يقينا أن هذا هو، في الواقع، فإن الخطأ.

وأخيرا، أقترح عليك تعريف متغير، int answer، وبدلا من printf()ing <م> جميع عناصر القائمة، مجرد الذهاب من خلال القائمة، إضافة قيمة رقمية من كل واحد لanswer، وهو ثم، في النهاية، طباعة answer. ولكن ربما أنا في عداد المفقودين نقطة مهمة. بدلا من ذلك، في كل مرة تقوم تكرار خلال الحلقة، بطباعة answer، حتى تستطيع أن ترى قيمة تنمو بشكل صحيح في كل مرة. وأعتقد أن هذا هو أقرب إلى ما كنت فعلا تريد أن تفعل في المهمة، ولكن لا أستطيع أن يستغرق وقتا طويلا للتحقق لأن لدي فئة للذهاب الى.

لأول مرة من خلال هاتفك حلقة x و y كلاهما تعيين نفس القيمة (منذ أن كنت = 1)، تتم طباعة المبلغ للخروج، ثم ترجع الدالة الذي ينتهي البرنامج. لذلك عليك أن تكون مجرد الحصول على القيمة الأولى وأضافت لنفسها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top