Una cuestión de procedimiento

Los datos de entrada deben escribirse en un archivo de datos según el formato, por ejemplo, llamado case4.txt

INICIO y FIN deben estar en mayúscula y no tener espacios, porque son líneas de control.

Guarde el siguiente programa en Judge.c y compílelo (lo probé con el compilador MS VC)

Ejecute el comando:

judge.exe case4. txt

=======================================

#include lt;stdio.hgt;

#include lt;stdlib.hgt;

#include lt;string.hgt;

ARCHIVO * fin;

main(int argc, char *argv[])

{

char nombre en[40];

int T ;

int i, j, k;

char str[8];

int N1, N2

car tmp sin firmar; ;

carácter sin firmar a[5000], b[5000];

char *buff;

if (argc lt; 2) {

printf("\007Uso: s nombre_archivo.txt\n", argv[0]);

printf("Por ejemplo: s case4.txt\n", argv[0]);

salir(1);

};

strcpy(nombre en, argv[1]); fopen(namein, "r")) ==NULL ) {

fprintf(stderr, "No se puede abrir el archivo de entrada s \n", namein);

exit(1 );

};

buff = (char *) malloc(5000 * sizeof (char));

if ( !buff ) {

printf("\007No hay suficiente espacio para asignar\n"); exit(1);

}

if ( fgets(buff, 5000, fin) != NULL){

sscanf(buff, "d", amp; T); // lee el número de casos

}; 0; klt; T; k )

{

// leer al primer INICIO

mientras (fgets(buff, 5000, fin) !=NULL) {

sscanf(buff, "s", y str[0]);

if (strncmp(y str[0], "START", 5) == 0) romper;

};

// leer archivo-1

N1 = 0; 5000, fin) !=NULL){

sscanf(buff, "s", y str[0]);

if (strncmp(y str[0], "FIN", 3) == 0) romper

for (j=0; jlt; 500

0; j ){

sscanf(buff j, "c", amp; tmp);

a[N1] = tmp; [N1] == '\n') {N1 = N1 1; romper };

N1 = N1

}

strcpy(amperio) ; buff[0], "\0");

};

// leer en el segundo INICIO

mientras (fgets(buff, 5000, fin) ) !=NULL){

sscanf(buff, "s", y str[0]);

if (strncmp(y str[0], "START"); , 5) == 0) romper

};

// leer archivo-2

N2 = 0

mientras; (fgets(buff, 5000, fin) !=NULL){

sscanf(buff, "s", y str[0]);

if (strncmp(amp; str[0], "END", 3) == 0) break;

for (j=0; jlt; 5000; j ){

sscanf(buff j, " c", amp; tmp);

b[N2] = tmp;

if (b[N2] == '\n') {N2 = N2 1; romper; };

N2 = N2 1;

}

strcpy(amp; buff[0], "\0"); >};

// comp 2 archivos:

if (N1 == N2) {

for (i=0; i lt; N1; i ) {

si (a[i] != b[i]) ir a Lab_comp_2;

};

} más {ir a Lab_comp_2 }; /p>

printf("¡Caso d aceptado!\n",k 1);

ir a Lab_next_case;

Lab_comp_2:;

// filtrar y comp

j=0;

for (i=0; ilt; N1; i){

a[j]=a[i] ;

si (a[i] != ' ' amp; amp; a[i] != '\t' amp; amp; a[i] != '\n') j = j 1;

};

N1 = j 1;

j=0; ; i ){

b[j]=b[i];

si (b[i] != ' ' amp;amp; b[i] != '\ t' amp;amp; b[i] != '\n') j = j 1;

};

N2 = j 1; si (N1 == N2) {

for (i=0;ilt;N1;i) {

si (a[i] != b[i])

goto Lab_comp_3;

};

};

printf("Error de presentación del caso d", k 1); >ir a Lab_next_case;

Lab_comp_3:;

printf("¡Caso d Respuesta incorrecta!\n", k 1);

Lab_next_case:;

};

salir(0);

}

================== = =========================

Principio del programa:

Utilice fgets() para leer un línea y analizarla Una línea.

La primera línea es el número de casos.

Cada caso tiene dos bloques de datos.

La línea inicial del bloque de datos es START y la línea final es END.

El número de líneas en cada bloque no es fijo, y el número de caracteres en cada línea no es fijo, pero cada bloque no debe exceder las 5.000 palabras.

Entonces, el tamaño de la matriz es 5000 y el tamaño del búfer de fila es 5000.

Compare dos bloques de datos después de leer cada caso.

Si el número de palabras es igual y cada palabra correspondiente es igual, imprime "Aceptar" y procesa el siguiente caso.

Si el número de palabras es igual y las palabras correspondientes son diferentes, o si el número de palabras no es igual, se realiza el filtrado y luego se compara después del procesamiento.

La respuesta al ejemplo es:

Caso 1 ¡Error de presentación!

Caso 2 ¡Error de presentación!

Caso 3 ¡Respuesta incorrecta!

p>

¡Caso 4 aceptado!

Archivo de entrada:

escriba case4.txt:

4

INICIO

1 2 = 3

FIN

INICIO

1 2=3

FIN

INICIO

1 2 = 3

FIN

INICIO

1 2 = 3

FIN

INICIO

1 2 = 3

FIN

INICIO

1 2 = 4

FIN

INICIO

1 2 = 3

FIN

INICIO

1 2 = 3

FIN