Juga membutuhkan kondisi di mana pengguna tidak dapat memasukkan nilai yang lebih tinggi dari 15. jika pengguna memasukkan heksa yang sama lagi, itu akan memulai ulang "loop"

 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
Marcus 29 November 2017, 21:55
Apa masalahnya? Kesalahan?
 – 
Dhiraj
29 November 2017, 22:01
Berapa nilai minimum yang diizinkan? Jika 0, maka tidak perlu meminta input ke-16.
 – 
chux - Reinstate Monica
29 November 2017, 23:05

2 jawaban

Saya akan mendefinisikan array digit "terlihat" tempat Anda menyimpan tanda 0/1 untuk angka yang telah dimasukkan pengguna, seperti

int seen[16]; // initialize with 0

Kemudian, setiap kali scanf_s memberi Anda masukan terbaru (sebut saja in untuk singkatnya), Anda memeriksa apakah seen[in] == 0. Jika ya, simpan saja nomornya di matrixArray, setel seen[in] = 1 dan lanjutkan. Jika tidak, pengguna telah memasukkan nomor dua kali. Buang saja inputnya, beri dia pesan kesalahan yang bagus dan lanjutkan. Itu bisa dilakukan dalam loop while.

kode semu

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
    }
  }
}
0
Pavel 29 November 2017, 23:08
Terima kasih telah menjawab, saya sudah mencoba melakukan apa yang Anda katakan tetapi belum tahu bagaimana menerapkannya. Bisakah Anda menuliskannya dengan cara yang sedikit lebih rinci ... Terima kasih, saya baru mengenal C :)
 – 
Marcus
29 November 2017, 23:00
Saya telah menambahkan beberapa kode semu. Cobalah, terapkan di C!
 – 
Pavel
29 November 2017, 23:11

Gunakan nilai sebelumnya yang dibaca untuk mencari duplikat

#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;
}
0
chux - Reinstate Monica 29 November 2017, 23:24