Unidad 1

Entrada y salida estándar, cin/scanf, cout/printf, ejercicios

Entrada Estandar

						
	//Leer una linea completa
	string a; 
	getline(cin,a);
	//Leer una palabra hasta un espacio
	string b;
	cin>>b; 
	//Leer un entero
	int a;
	cin>>a;
	scanf("%d",&a); 
	//Ejemplo leer horas 10:55:55
	int horas, minutos, segundos;
	scanf("%d:%d:%d",&horas,&minutos,&segundos);						
						
					

Salida Estandar

						
	printf("Texto sin salto de linea");
	cout<<"Texto sin salto de linea";
	printf("Salto de linea\n");
	cout<<"Salto de linea\n";
	cout<<"Salto de linea"<<endl;
	int numero = 10;
	printf("%d\n",numero);
	double pi = 3.141592654;
	printf("%.4f\n", pi); //3.1416
						
					

Estructura de un ejercicio Acepta el Reto 116

Enunciado: Escribir un programa que escriba tantos "Hola mundo." como nos pidan.

Entradas: La entrada consta de una única línea que contiene un número n, 0 ≤ n ≤ 5, que indica cuántos mensajes hay que emitir.

Salidas: Cada mensaje a escribir aparecerá en una única línea y será la cadena "Hola mundo.".

Entradas Salidas
3 Hola mundo.
Hola mundo.
Hola mundo.

Estructura de la solución

						
	#include <bits/stdc++.h>
	using namespace std;
	int main() {
		int cases; cin>>cases;
		while(cases--)
		{
			cout<<"Hola mundo.\n";
		}
		return 0;
	}
							
					

Estructura de un ejercicio

Enunciado: Dados dos numeros a y b, retornar a+b.

Entradas: Un numero n indicando el número de casos de prueba. Luego n lineas con dos enteros a y b separados por espacios.

Salidas: Para cada caso imprimir una linea con a+b

Entradas Salidas
3
1 2
5 9
10 14
3
14
24

Estructura de la solución

						
	#include <bits/stdc++.h>
	using namespace std;

	int main(){
		int cases,a,b; scanf("%d",&cases);
		while(cases--){
			scanf("%d %d",&a,&b);
			printf("%d\n",a+b);
		}
		return 0;
	}
						
					

Tipos de entradas

Entrada individual

Un solo caso de prueba.

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

Número de casos de prueba

Primero se indica cuantos casos de prueba se evaluaran, y posteriormente se indica cada caso.

            
	int cases,a,b; scanf("%d",&cases);
	while(cases--){
		scanf("%d %d",&a,&b);
		printf("%d\n",a+b);
	}
            
          

EOF - números

Se evaluan varios casos de prueba, pero no se indica cuantos. El programa debe leer mientras aun queden datos por evaluar.

            
	int a,b;
	while(scanf("%d %d",&a,&b)==2){ //Si fuera un número 1, dos 2, tres 3
		printf("%d\n",a+b);
	}
            
          

EOF - palabra

Se evaluan varios casos de prueba, pero no se indica cuantos. El programa debe leer mientras aun queden datos por evaluar.

            
	string palabra;
	while(cin>>palabra){ 
		cout<<palabra;
	}
            
          

EOF - linea

Se evaluan varios casos de prueba, pero no se indica cuantos. El programa debe leer mientras aun queden datos por evaluar.

            
	string linea;
	while(getline(cin,linea)){ 
		cout<<linea;
	}
            
          

Lectura de fechas

Existen problemas con lecturas particulares donde gracias a scanf son muy fáciles de realizar.

            
	int horas,minutos,segundos;
	//11:30:15
	scanf("%d:%d:%d",&horas,&minutos,&segundos);
            
          

Lectura de matriculas

Existen problemas con lecturas particulares donde gracias a scanf son muy fáciles de realizar.

            
	char letras[3];
	int numeros;
	//5555CPP
	scanf("%d%s",&numeros,letras);
            
          

Lecturas con scanf

Optimizando Lecturas de Enteros

					
	#include <bits/stdc++.h>
	using namespace std;

	//inline int getchar_unlocked() { return getchar(); }
	inline void fastInput(int &n){
		char ch;
		int sign = 1;
		while(ch = getchar_unlocked(), isspace(ch)) {
		};
		n = 0;
		if(ch == '-') sign = -1;
		else n = ch - '0';
		while(ch = getchar_unlocked(), isdigit(ch))
			n = (n << 3) + (n << 1) + ch - '0';
		n *= sign;
	}
	int main(){
		int n; fastInput(n);
		return 0;
	}
					
				  

Salidas

		 
	int x = 3; 
	printf("%02d",x); //Salida 03 útil para formatos horarios
	double x = 31415.9265; //Imprimir ciertos decimales
    printf("%.3lf", x); //31415.927
	x = 31415.9265;
    printf("%.3lf", x); //31415.926
	x = 31415.9265;
    printf("%.3lf", x); //31415.927
		
	  

Optimizar Salidas

NOTA: En un problema, estos cambios no deben suponer la diferencia entre TLE y AC. Esto se usa si se quiere bajar el tiempo de un problema con AC.

  • Uso de printf frente a cout
  • Uso de scanf frente a cin
  • Uso de fastinput frente a scanf
  • En algunos problemas el no poner return 0 optimiza
  • Uso de ios_base::sync_with_stdio(false); cin.tie(NULL);

¿Como evitar cada vez poner el caso de prueba y salida para probar el código?

Leer fichero de entrada: freopen("PATH","r",stdin);

Sacar a fichero (útil en algunos jueces que tiene casos de pruebas largos para probar, como los que se pueden encontrar en udebug)

Sacar a fichero: freopen("PATH","w",stdout);

De esta manera con scanf/cin y printf/cout podemos leer los casos de prueba e imprimir a fichero

¡Resolvamos un problema!

¿Qué lado de la calle?

Acepta el Reto - 217

... Una vez hecho eso, las viviendas que quedan al lado izquierdo (respecto al punto inicial) reciben números impares consecutivos, y las que quedan al lado derecho números pares consecutivos. ...

Input: El programa recibirá, por la entrada estándar, un conjunto de casos de prueba, cada uno en una línea. Cada caso de prueba estará compuesto de un número de vivienda. Se garantiza que nunca será mayor que 1.000. El último caso, que no deberá procesarse, será el número 0.

Output: Para cada caso de prueba el programa escribirá "IZQUIERDA" (sin las comillas) si la vivienda está situada a la izquierda de la calle, y "DERECHA" si está a la derecha.

Input Output
3
10
41
0
IZQUIERDA
DERECHA
IZQUIERDA

Solución

            

	#include <bits/stdc++.h>
	using namespace std;

	int main(){
		int numero;
		while(scanf("%d",&numero)==1 && numero!=0){
			if(numero%2==0) printf("DERECHA\n");
			else printf("IZQUIERDA\n");
		}
		return 0;
	}
            
          

Ejercicios propuestos