domingo, 27 de noviembre de 2011

Lectura de Datos (Parte 1)

Hola nuevamente!

Para empezar, es recomendable hayan leído la anterior publicacicón.

Como mencioné, obtendremos los datos del archivo: in.txt o como deseen llamarlo.

int main() {
    freopen("in.txt", "rt", stdin);

    freopen("out.txt", "wt", stdout);    
    return 0;
}

La información que vayamos a imprimir aparecerá en el archivo: out.txt.

Ahora, lo importante es saber qué tipo de datos vamos a leer.

//-------
--------------------------------------------------------------------------------
Sí son puros enteros, la lectura será sencilla:

int d;
scanf("%d",&d);
printf("%d\n",d);


Como pueden apreciar, la lectura es sencilla, ya dependerá de como sea el input, que será puesto en el archivo in.txt.

Problema Ejemplo:

Input

La primera línea tendrá como dato el entero T, 1<=T<=100, que será el número de casos. Por cada caso de habrán dos líneas. La primera línea tendrá como dato el entero N, 1<=N<=100. La segunda línea del caso tendrá N enteros (i1, i2, ...., iN) -1000<=i<=1000.

Output
Por cada caso de prueba se imprimirá en una línea la suma de los N enteros dados como datos.

in.txt3
4
5 6 7 8
10
1 2 3 4 5 6 7 44 2 21
3
1 -1 3

out.txt
26
95
3

Solución

#include
int main() {
    freopen("in.txt", "rt", stdin);
    freopen("out.txt", "wt", stdout);

    int T;
    scanf("%d",&T);

    for(int I = 0; I < T; I++) {
    
    int N, suma = 0;
        scanf("%d",&N);

    
    for(int i = 0; i < N; i++) {
            int a;
            scanf("%d",&a);
            suma += a;
        }

    
    printf("%d\n",suma);
    }

    return 0;
}


Al momento de mandar el problema(este no es un problema de UVA) no se olviden de comentar o borrar las dos líneas de freopen();.

Como verán, la lectura de datos fue sencilla. Cabe recalcar que cree un for(...) inicial con la variable I(i mayúscula), ya que en cada caso de prueba es muy probable, como en este caso, usar uno o más de un for(...) y para mantener el estándar de usar for(int i = 0....) en cada caso, use la variable I(i mayúscula) en el primer for(...).

Un dato importante, y creo lo mencioné en el anterior post, pero lo recalco:

Al final de todos los casos de prueba, de imprimir toda la información que se pide, siempre, hasta ahora no he encontrado algo contrario, se imprime el caracter '\n'. En nuestro caso de ejemplo, siempre imprimimos el caracter luego de imprimir la suma total:

printf("%d\n",suma);


//---------------------------------------------------------------------------------------

Ya saben, sí tienen alguna duda o desean toque algún tema en especial, coméntenlo. En el posterior post hablaré de los datos de entrada reales(flotantes) y la lectura de caracteres. Así mismo, posteriormente mencionaré los límites de cada variable.

Primer paso...

Hola! Este es el primer post y por ello empezaremos con algunos datos básicos que deben saber al empezar a programar problemas de cualquier Online Judge.

He aquí algunas páginas con las que podrán empezar a programar diversidad de problemas Input/Output:

http://uva.onlinejudge.org/

- Una página gran cantidad de problemas por resolver. El blog estará basado, principalmente, por ahora, en el desarrollo de problemas en esta página. (UVA)

http://livearchive.onlinejudge.org/

- Esta página, muy parecida al UVA, tiene los problemas de los regionales y mundiales que se realizan cada año. Sin duda alguna, una buena base para prepararse de cara a las etapas regionales. (ACM-ICPC)

http://uhunt.felix-halim.net/
- Esta página, sin duda alguna, nos servirá mucho en el desarrollo de diferentes problemas del UVA, ya que clasifica gran cantidad de problemas para poder prepararse de cara a las etapas regionales y mundiales. (uHunt)

http://community.topcoder.com/tc
- Adjunto el link de esta página, ya que me han dado buena referencia de ella. Acabo de realizar mi registro, así que más adelante podré comentar sobre esta página, pero sé que es un buen site para entrar en ambiente de competencia. (TC)

Más adelante agregaré otras páginas. La idea es compartir mi conocimiento con ustedes, aún estoy aprendiendo muchas cosas más, pero sí desean algún tema en especial, lo puedo comentar o investigar. Al igual que ustedes, yo estoy en etapa de preparación y por ello, cada cosa nueva e interesante que aprenda la iré poniendo aquí.

Los lenguajes que usaré será C++ en su mayoría y Java para algunos temas puntuales, que se verán mucho más adelante.

Mi usuario, por sí desean ver mi avance en UVA o en las páginas de programción en las que vaya entrando:
- Fraaraco

Bueno, para empezar, créense un usuario en UVA, luego abrirán la págin de uHunt y empezaremos a programar...

En uHunt inserten su usuario de UVA. Al inicio, a menos que hayan programado antes en UVA, verán vacío su ranking de problemas resueltos. Cabe recalcar que es necesario usar Chrome o Safari, ya que en Internet Explorer no corre correctament el uHunt. Abajo, en la página leerán: "Competitive Programming Exercises", seguido de una lista de temas:

2nd Ed's Exercises (switch to 1st Ed)
Book Chapters
1. Introduction
2. Data Structures and Libraries
3. Problem Solving Paradigms
4. Graph
5. Mathematics
6. String Processing
7. (Computational) Geometry
8. More Advanced Topics

Estos son los temas de la 2da versión del libro "Competitive Programming"(si pueden adquirirlo, sería ideal hacerlo!!!). El blog estará basado en la búsqueda de la resolución de los problemas de la 2da versión del libro y algunos en la 1ra versión. Cabe mencionar que no proporcionaré código de un problema, tomaré de ejemplo algunos, pero evitaré dar el código completo de una solución, ya que la idea es que ustedes puedan resolver los problemas por su cuenta. Sufriendo aprenderán más :D!

Bueno, si no se me escapa ningún punto más, empezaré con algo básico que deben saber... Es hora de algo de código xD!

#include

int main() {

    //freopen("in.txt", "rt", stdin);
    //freopen("out.txt", "wt", stdout);
return 0;
}


Al empezar a resolver los problemas del UVA deben saber que no recibe algunas librerías como conio.h o stdafx.h, por lo que eviten usarlas. Para los programadores en Visual C++, deben borrar la librería stdafx.h antes de enviarla a UVA.

¿Qué hace el freopen?
- Bueno, la respuesta es sencilla, el freopen sólo se usa para realizar pruebas al código antes de ser enviado. Primero, se crea un archivo in.txt en la carpeta donde está almacenado el proyecto. Segundo, en este archivo se escribe los datos de entrada que te dan en el problema para poder realizar las pruebas correspondientes al código. Esto evitará tener que usar la consola para entrar los datos. Las impresiones mostradas en el output del problema, aparecerán en el archivo out.txt, sin necesidad que este se cree y se modificará automáticamente.

¿Qué más debo saber antes de empezar?
- Uno debe ser preciso al momento de imprimir el output de un problema, ya que debe ser exacto al output de ejemplo y cumplir con las reglas de impresión que ahí se ven. Asímismo, uno debe siempre realizar un salto de línea al final de la impresión.

¿Por dónde empezar?
- En uHunt, elijan el capítulo 1, luego procedan a desarrollar los problemas Ad Hoc.

Bueno, para ser el mensaje de bienvenida a sido un poco largo, pero a partir de ahora evitaré dar muchas palabras y escribiré los tips que he ido aprendiendo en el desarrollo de diversos problemas.

Nos vemos en el siguiente post, en el que veremos lectura de datos.

Suerte y comenten sí tienen alguna duda!!!

Fredy