2017-11-23 15 views
1

숙제 입력에 문제가 있습니다. stdin에서 특별히 형식화 된 입력을 얻을 것입니다.특정 형식 (행렬)으로 입력

첫 번째 줄에는 행의 크기 (행과 열)를 결정하는 2 개의 정수가 있습니다. 모든 행은 행렬의 행을 나타냅니다.

본질적으로 getline()과 같은 것을하고 싶지만 getline()을 사용하고 싶지 않습니다. 사실 나는 숙제에서 금지되어 있습니다. 따라서 int (또는 char char에 의해 추측)에 의해 int를 스캔해야합니다. 여기서 문제는 방탄 (거의)해야한다는 것입니다. 최소한 더미 증거.

나는 EOF와 그 내부의 다른 루프 (아마도?)를 계속 읽는 큰 while 루프를 상상하고 있는데, 항상 라인을 읽고 그것을 할당 된 매트릭스에 저장 한 후 다음 라인으로 넘어갑니다. 저는 '\ n'을 확인해야한다는 것을 알고 있습니다. 그러나 저는 오늘 해결책을 생각할 능력이 부족합니다.

다음과 같이 작업하고 있습니다. 행렬은 구조입니다.

struct Matrix{ 
    int nrows; 
    int ncols; 
    int** matrix; 
}; 

나는 여러 기능을 가지고 있습니다.

함수

동적으로 특정 크기의 행렬을위한 공간을 할당합니다 :

struct Matrix init_matrix(int r, int c) 
{ 
    struct Matrix mat; 
    mat.nrows = r; 
    mat.ncols = c; 
    mat.matrix = calloc(r, sizeof(int *)); 
    for(int i = 0; i < r; ++i) 
    { 
     *(mat.matrix+i) = calloc(c, sizeof(int)); 
    } 

    return mat; 
} 

함수를 이전에 할당 된 공간을 무료로 :

void free_matrix(struct Matrix mat) 
{ 
    int top = mat.nrows; 
    for(int i = 0; i < top; ++i) 
    { 
     free(mat.matrix[i]); 
    } 
    free(mat.matrix); 
} 

은 그 두 기능을 완벽하게 정상적으로 작동합니다. 이제

내가 예를 들어 내가받을되어있어 입력을 읽어들이는 기능 create_matrix (무효) (적어도 내가 어떤 인수를하지한다고 생각합니다), 만들려고 노력 해요 :

3 3 
1 2 3 
4 5 6 
7 8 9 

함수가 입력을 읽을 때 입력이 올바르지 않거나 잘못된 형식인지 알 수 있으며 해당 종료 값 (예 : 100 fe)을 사용하여 프로그램을 종료 할 수 있습니다. 입력이 올 바르고 올바른 형식이면 init_matrix) 다음 입력을 행렬에 저장합니다. 여러분의 깊은 이해에 대한

: 내가받을되어있어 전체 입력은 다음과 같습니다 행렬 A (위와 같이, 첫 번째 줄의 크기, 후 라인의 값) 연산 (+, -, *) 매트릭스 B

그런 다음 (A * B, A + B 등) 작업을 실행하십시오. 나는 대부분의 것들을 함수로 만들려고 노력하고 있는데, 그래서 메인은 매우 단순 할 것이다. 그 라인에서

int main(int argc, char *argv[]) 
{ 
    struct Matrix mat1 = create_matrix(); 
    char operation = get_operation(); 
    struct Matrix mat2 = create_matrix(); 
    struct Matrix result = compute(mat1,mat2, operation); 
    return 0; 
} 

무엇인가, 당신은 저를 얻는 경우에. 문제는 프로그램을 충분히 복잡하게 만들고 나중에 두 개가 아닌 더 큰 시퀀스 (최대 100 개)를 처리하도록 편집 할 수있게하려는 것입니다. 지금 당장은 더러운 방식으로 한 번에 두 개의 행렬에 대해 작동하도록 할 수는 있지만 실제로 원하지 않는 방식입니다.

+1

그래서 무엇이 문제입니까? 지금까지의 계획은 괜찮아 보입니다. –

+0

create_matrix 함수 구조입니다.처음에는 크기 값을 검사하고 첫 번째 줄에 있는지 확인한 후 나머지를 수행하는 더 큰 검사를 수행하는 방법을 상상할 수 없습니다. 나는 2 개의 스캔이있을 것이라고 의심하지만, 내가 상상할 수있는 모든 것에 대해서는 의심 스럽다. – Welsy

+0

'getline()'을 사용할 수없는 경우'fgets()'를 사용하여 행을 읽습니다. 그 중 하나를 사용할 수 없다면'getline()'에 대한 대리자를 작성하십시오. 그것은 어렵지 않습니다. 'scanf()'함수는 새로운 행을 포함하여 포기 된 공백을 건너 뛰고 단순히 데이터가 올바른 행에 있는지 확인하는 데 사용할 수 없습니다. 처리 할 줄이 있으면 루프에서'sscanf()'를 사용하십시오. –

답변

1

글쎄, 어떻게 해결했는지. 그것은 작동합니다. 완벽에 가까운 곳이 아니지만 작동합니다. 업로드 시스템이 가져 와서 점수를 전부주었습니다. 그래서 만족합니다.

struct Matrix read_matrix(FILE *fp) 
{ 
    struct Matrix mat; 
    //FIRST LINE 
    int ch; 
    int i = 0; 
    int n = 20; 
    char* line = calloc(n,sizeof(char)); 
    while((ch = fgetc(fp)) != EOF && ch != '\n') 
    { 
     *(line + i++) = ch; 
    } 
    *(line + n-1) = '\0'; 
    int r,c; 
    int k = sscanf(line,"%d %d", &r, &c); 
    if(k != 2) 
    { 
     fprintf(stderr, "Error: Chybny vstup!\n"); 
     exit(100); 
    } 
    free(line); 
    //MATRIX 
    line = calloc(c, sizeof(int)); 
    mat = init_matrix(r, c); 
    i = 0; 
    r = 0; 
    while(r < mat.nrows && (ch = fgetc(fp))) 
    { 
     if(ch == '\n' || ch == EOF) 
     { 
      *(line + i) = '\0'; 
      int offset; 
      char *data = line; 
      for(int j = 0; j < mat.ncols; ++j) 
      { 
       int d = sscanf(data, " %d%n", &mat.matrix[r][j], &offset); 
       if(d != 1){ 
        fprintf(stderr, "Error: Chybny vstup!\n"); 
        exit(100); 
       } 
       data += offset; 
      } 
      i = 0; 
      ++r; 
      if(ch == EOF){ 
       break; 
      } 
     } else 
     { 
      *(line + i++) = ch; 
     } 
    } 
    free(line); 
    return mat; 
}