不算额外的数字[魔方]

时间:2017-12-05 20:56:02

标签: c counter

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define N_MAX 10
#define N_MIN 2
#define TEMPSIZE 1024

float RowSum(float **matrix, int sizearray,int row) {
    float sum;
    for (int j=0 ; j <= row; j++) {
        sum = 0;
        for (int i=0 ; i < sizearray; i++) {
            sum = sum + matrix[j][i];
        }
    }
    return sum;
}

float ColSum(float **matrix, int sizearray, int col) {
    float sum;
    for (int j = 0; j <= col; j++) {
        sum = 0;
        for (int i = 0; i < sizearray; i++) {
            sum = sum + matrix[i][j];
        }
    }
    return sum;
}

int RepNum(int arraysize, float **matrix) {
    int i, j, counter = 0;
    int temparray[N_MAX*N_MAX];
    for (i = 0; i < N_MAX*N_MAX; i++) {
        temparray[i] = 0;
    }
    for (i = 0; i < arraysize; i++) {
        for (j = 0; j < arraysize; j++) {
            temparray[(int)matrix[i][j]]++;
        }
    }
    for (i = 1; i < arraysize*arraysize; i++) {
        if (temparray[i] > 1)
            counter++;
    }
    return counter;
}


void PrintArray(float **matrix, int arraysize) {
    for (int i = 0; i<arraysize; i++)
    {
        for (int j = 0; j<arraysize; j++)
            printf("%3d ", (int)matrix[i][j]);
        printf("\n");
    }
}

int CheckInt(float **matrix, int arraysize) {
    int counter = 0;
    for (int i = 0; i < arraysize; i++) {
        for (int j = 0; j < arraysize; j++) {
            if (((int)matrix[i][j]) != matrix[i][j])
                counter++;
        }
    }
    return counter;
}

void main() {
    printf("Hello! this program will help you to find out if you have a magic square!\nPlease enter your matrix order and following it the numbers you'd like to check: \n");
    float **matrix;
    char input[TEMPSIZE];
    int sizear = 0;
    float correctsum = 0.0;
    int counter = 0, row, column;
    fgets(input, TEMPSIZE, stdin);
    char* str = strstr(input, " ");
    if (str == 0)
        return;
    str[0] = 0;
    str++;  
        sizear = atof(input);
        if (sizear > N_MAX || sizear < N_MIN)
        {
            printf("ERROR: The matrix size cannot be %d size. \n", sizear);
            exit(0);
        }
        matrix = (float**)calloc(1, sizear * sizeof(float*));
        for (column = 0; column < sizear; column++)
        {
            matrix[column] = (float*)calloc(1, sizear * sizeof(float));
        }
        for (row = 0; row < sizear; row++)
        {
            for (column = 0; column < sizear; column++)
            {
                char* temp = strstr(str, " ");
                if (temp == 0) /*gets the last number*/
                {
                    ++counter;
                    matrix[row][column] = atof(str);
                    goto end;
                }
                if (atof(temp) <= sizear*sizear && atof(temp) > 0) { /*puts all numbers in matrix*/
                    temp[0] = 0;
                    matrix[row][column] = atof(str);
                    str = temp + 1;
                    ++counter;
                }
                else {
                    printf("you cannot enter the number %.3f \n", atof(temp));
                    exit(0);
                }
            }
        }

    end:
        if (counter > sizear*sizear) {
            printf("you've entered %d numbers, while you should've enter %d numners \n", counter, sizear*sizear);
        }
        else if (counter < sizear*sizear) {
            printf("you've entered %d numbers, while you should've enter %d numners \n", counter, sizear*sizear);
        }
        else if (counter == sizear*sizear) {
            correctsum = (float)((sizear*(sizear*sizear + 1)) / 2);
            float row = RowSum(matrix, sizear, 0);
            float coul = ColSum(matrix, sizear, 0);
            if (row == coul && row== correctsum && coul==correctsum && RepNum(sizear, matrix) ==0 && CheckInt(matrix,sizear)==0) {
                printf("It's a magic matrix!\n");
                PrintArray(matrix, sizear);
            }
            else {
                printf("Not a magic square:\n");
                if (row != coul && row != correctsum && coul != correctsum) {
                    printf("* Coloums and rows sum do not match.\n");
                }
                if (RepNum(sizear, matrix) != 0) {
                    printf("* There are repeating numbers.\n");
                }
                if (CheckInt(matrix, sizear) != 0) {
                    printf("* One of the numbers or more you've entered isn't integer.\n");
                }
            }
        }
        for (column = 0; column < sizear; column++)
        {
            free(matrix[column]);
        }
        free(matrix);
    }

当我击中超过sizearrayXsizearray数字时,它不会添加到计数器中并停在sizearrayXsizearray计数处。任何人都可以指出为什么它不算数呢? 练习要求检查输入是否是魔术方(sum rows = columns = diagonals),确保没有重复,只有int数字,并且我没有输入多于或少于sizearrayXsizearray数字。来自用户的输入应该看起来像3 1 2 3 4 5 6 7 8 9,其中第一个数字(此处为3)是数组大小,其余是将被检查为魔方的数字。

1 个答案:

答案 0 :(得分:0)

  

当我击中的大小超过sizearrayXsizearray数字时,它不会添加到计数器中,并且会停止在sizearrayXsizearray计数上。谁能指出为什么它不计算在内?

当然,这很简单:计数器在循环中递增

        for (row = 0; row < sizear; row++)
        {
            for (column = 0; column < sizear; column++)
            {
                …
            }
        }

-内部语句(最多)运行 sizear × sizear 次,因此从0开始的计数器不能达到更高的值。