【问题标题】:Prevent user from entering the same number more than once防止用户多次输入同一个号码
【发布时间】:2018-05-13 13:52:41
【问题描述】:

还需要一个条件,即用户不能输入高于 15 的值。 如果用户再次插入相同的六边形,它将重新启动“循环”

 int matrixArray[4][4], i, j, rowsum, columnsum, diagonalsum;


 printf("Skriv in 16 olika värden för din 4 x 4 kvadrat: "); // asks user to insert 16 numbers to see if its a magicsquare

 for (i = 0; i < 4; i++) {
        for (j = 0; j < 4; j++) {
            scanf_s("%x", &matrixArray[i][j]);  // inserts values into the array

            }
        }

【问题讨论】:

  • 有什么问题?错误?
  • 允许的最小值是多少?如果为 0,则无需请求第 16 个输入。

标签: c arrays loops conditional-statements


【解决方案1】:

使用读取的先前值查找重复项

#define ROW 4
#define COL 4
int total = ROW*COL;
printf("Skriv in %d olika värden för din %d x %d kvadrat: ", total, ROW, COL); 
for (int i = 0; i < total; i++) {
  bool duplicate;
  do {
    duplicate = false;
    unsigned value; 
    if (scanf_s("%x", &value) != 1) {
      printf("Numeric data not entered\n");
      exit(-1);
    }
    for (int k = 0; k < i; k++) {  // look through prior values
      int r2 = k/COL;
      int c2 = k%COL;
      if (value == matrixArray[r2][c2]) {
        duplicate = true;
        printf("Duplicate\n");
        break;
      }
    }
  } while (duplicate);  // reject recent entry and try again.
  int r = i/COL;
  int c = i%COL;
  matrixArray[r][c] = value;
}

【讨论】:

    【解决方案2】:

    我会定义一个“已见”数字数组,在其中存储用户已经输入的数字的 0/1 标志,类似于

    int seen[16]; // initialize with 0
    

    然后,每次scanf_s 为您提供最新输入(为简洁起见,我们称之为in),您检查是否seen[in] == 0。如果是,只需将号码存储在matrixArray 中,设置seen[in] = 1 并继续。如果不是,则用户输入了两次数字。只需丢弃输入,给她一个很好的错误消息并继续。这可以在while 循环中完成。

    伪代码

    ok = false
    for i = 1..4 {
      for j = 1..4 {
        while (not ok) {
          in = scanf()
          if (not 1 <= in <= 16)
            error("input must be between 1 and 16; try again")
            continue
    
          if seen[in] == 1
            error("you already entered that number; try again")
            continue
          else
            matrixArray[i][j] = in
            seen[in] = 1
            ok = true
        }
      }
    }
    

    【讨论】:

    • 感谢您的回答,我一直在尝试按照您所说的做,但还不知道如何实现它。你能把它写得更详细一点吗?谢谢,我是 C 新手 :)
    • 我添加了一些伪代码。试一试,用 C 实现它!
    猜你喜欢
    • 2023-03-09
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    相关资源
    最近更新 更多