【问题标题】:Nested loop statement incorrect results嵌套循环语句不正确的结果
【发布时间】:2013-11-02 03:13:45
【问题描述】:

我有一个程序会询问学生姓名和他/她的 10 个班级。该代码是为了防止重复条目,但每次我运行程序时它都会说每个条目都已经存在。我已经经历了一千次这件事,但我一生都无法弄清楚。对我的问题的任何见解将不胜感激。

#include <iostream>

using namespace std;

struct student
{
   string name;
   string classes[10];
};

int main(int argc, char *argv[])
{
  string test_name;
  student entry;

  cout << "Enter the name of the student you wish to insert (string) \n"; 
  cin >> entry.name;

  for(int i = 0; i < 9; i++)
  {
    cout << "Enter class number " << i + 1 << " For " << entry.name << endl; 
    cin >> test_name;

    for(int j = 0; j < 9; j++)
      if(test_name == entry.classes[j])
      {
         cout << "Class already exists for " << entry.name << ". Please try again.\n";
         i -= 1;
      }
      else
      {
          entry.classes[i] = test_name;
      }
  }
  system("PAUSE");
  return EXIT_SUCCESS;
}

【问题讨论】:

  • 您没有嵌套的if 语句。
  • 对不起应该说循环不是如果
  • 我相信这只会循环 9 次,而不是 10 次:for(int i = 0; i &lt; 9; i++)。所以改为for(int i = 0; i &lt; 10; i++)。不会解决您的问题,但否则您的任务将失败!
  • 不,它肯定会运行 10 次。 0-9 是十个而不是 9 个总数
  • 循环只运行 0-8。在每次循环迭代之前测试条件i &lt; 9,一旦该条件为假,循环就结束。当i 九岁时,它永远没有机会运行。

标签: c++ if-statement for-loop nested-loops


【解决方案1】:

您的内部 for 循环测试所有 10 个位置,包括您要插入新类的位置。

您真的只想扫描填充的位置,看看是否有任何匹配,然后,在循环之外,如果新类不重复,则添加它。

伪代码:

for (i = 0; i < 10; i++)
{
    get class 'i';

    bool repeat = false; 

    for (j = 0; j < i; j++)  // Only check previous classes (j < i)
        if (test_name == entry.classes[j])
        {
            repeat = true;
            break;
        }

    if (repeat) 
    {
         output the error
         rewind 'i'
         continue;
    } else
    {
         insert the new entry
    }
}

【讨论】:

  • 是的。这就是问题所在。
  • 即使数组未填充,为什么它会认为其中一个空槽等于条目?
  • @user2837034:在原始循环中,程序在每次迭代时将新条目插入到插槽 i 中,它没有test_nameentry_classes[j]。结果是到j == i 时,程序已将entry_classes[i] 设置为test_name,因此循环将在j == i 的迭代中检测到冗余条目。 j 循环还测试了 j &gt; i 的条目这一事实是一个单独的附加错误。
  • @user2837034 : 我解释得够清楚了吗?如果没有,请告诉我,我可以尝试进一步解压。
【解决方案2】:

虽然这是在 Java 中,但你可以做类似的事情,我认为它满足了忽略类数组中已经存在的任何输入并在达到 10 个类之前添加它的要求:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;



public class Test {

    public static void main(String[] args) throws IOException {


        ArrayList < String > classes = new ArrayList < String > ();


        System.out.println("Enter the name of the student you wish to insert (string) \n");



        while (classes.size() < 10) {


            BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System. in ));
            String s = bufferRead.readLine();


            for (String classy: classes) {
                if (classy.equals(s)) {
                    System.out.println("This is duplicate class");
                    break;

                }


            }
            classes.add(s);



        }
        System.out.println("Ten Classes have been input");



    }

}

【讨论】:

    【解决方案3】:

    要真正了解,在您的 if() 语句之前添加这一行有什么问题:

    cerr << "test_name == \"" << test_name << "\", entry.classes[j] == \"" << entry.classes[j] << "\"\n"
    

    我希望你看到的是 test_name 出于某种原因是空的,而且我知道所有未初始化的字符串都会显示为空字符串。但是,不管有什么问题,上面的行都应该显示出来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-04
      • 2013-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 2015-10-01
      • 1970-01-01
      相关资源
      最近更新 更多