0

M x Nこれは整数の行列です。

  • 自動塗りつぶし、または手動塗りつぶしをお願いします。
  • 自動を選択すると、いっぱいになります。
  • 次に、行列をテストして、その列(1)または行(0)が回文(例:)であるかどうかを確認します1 2 9 2 1
  • 再起動または終了をお願いします。

fgets再起動すると、マトリックスが自動的にいっぱいになります。これは、がしばらくの間であり、常に実行される必要があるため、なぜ発生しているのかわかりません。

関数llenar_matriz、4行目。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define COL 5
#define FIL 5

int reiniciar( void );
void llenar_matriz( int mat[ FIL ][ COL ] );
void imprimir_matriz( int mat[ FIL ][ COL ] );
int matriz_palindrome( int mat[ FIL ][ COL ], int tipo );

int main () {
    do {
        int mat[ FIL ][ COL ] = {0};
        llenar_matriz( mat );
        if ( matriz_palindrome( mat, 1 ) ) {
            puts( "Las columnas de la matriz son palindromos" );
        }
        else {
            puts( "Las columnas de la matriz no son todas palindromos" );
        }
    } while( reiniciar() );
    system( "pause" );
}

void imprimir_matriz( int mat[ FIL ][ COL ] ) {
    int i, j;
    for( i = 0; i < FIL; i ++ ) {
        for( j = 0; j < COL; j++ ) {
            printf( "%4d", mat[ i ][ j ] );
        }
        printf( "\n" );
    }
}

void llenar_matriz( int mat[ FIL ][ COL ] ) {
    char rta[3];
    int i, j;
    printf( "Desea llenar la matriz automaticamente? Si / No\n" );
    while( fgets( rta, 3, stdin ) == NULL ) {
        fflush( stdin );
        printf( "Ocurrio un error al obtener su respuesta. Intente nuevamente.\n" );
    }
    if( strcmp( rta, "No" ) == 0 | strcmp( rta, "no" ) == 0 ) {
        for( i = 0; i < FIL; i++ ) {
            for( j = 0; j < COL; j++ ) {
                printf( "Ingrese el valor de la posicion %d, %d\n", i+1, j+1 );
                while( scanf( "%d", &mat[ i ][ j ] ) == NULL ) {
                    fflush( stdin );
                    puts( "Hubo un error al obtener su respuesta. Intente nuevamente" );
                }
                imprimir_matriz( mat );
            }
        }
    }
    else {
        srand( time(NULL) );
        for( i = 0; i < FIL; i++ ) {
            for( j = 0; j < COL; j++ ) {
                mat[ i ][ j ] = rand() % 99 + 1;
            }
        }
        imprimir_matriz( mat );
    }
    fflush( stdin );
}

int reiniciar( void ) {
    char rta[3];
    int centinel = 0;
    puts( "Desea reiniciar la prueba? Si / No" );
    do{
        while( fgets( rta, 3, stdin ) == NULL ) {
            fflush( stdin );
            printf( "Ocurrio un error al obtener su respuesta. Intente nuevamente.\n" );
        }
        if( strcmp( rta, "Si" ) == 0 | strcmp( rta, "si" ) == 0 ) {
            return 1;
        }
        else {
            if( strcmp( rta, "No" ) == 0 | strcmp( rta, "no" ) == 0 ) {
                return 0;
            }
            else {
                printf( "Respuesta incorrecta. Intente nuevamente.\n" );
                centinel = 1;
            }
        }
        fflush( stdin );
    } while( centinel );
}

int matriz_palindrome( int mat[ FIL ][ COL ], int tipo ) {
    int i, j;
    if( tipo == 0 ) {
        for( i = 0; i < FIL; i++ ) {
            for( j = 0; j <= COL/2; j++ ) {
                if( mat[ i ][ j ] != mat[ i ][ COL - j - 1] ) {
                    return 0;
                }
            }
        }
    }
    if( tipo == 1 ) {
        for( i = 0; i < COL; i++ ) {
            for( j = 0; j <= FIL/2; j++ ) {
                if( mat[ j ][ i ] != mat[ FIL - j - 1 ][ i ] ) {
                return 0;
            }
            }
        }
    }
    return 1;
}
4

1 に答える 1

0

問題は、関数 reiniciar() の fflush(stdin) が読み取られなかったことです。これは、関数が前の行で値を返すためです。return 1そのため、関数の の前に移動しreiniciarて解決しました。

于 2012-10-12T00:26:16.540 に答える