C/Visual C - Ayuda en la comprensión de este ejecicio.

   
Vista:

Ayuda en la comprensión de este ejecicio.

Publicado por Diego (85 intervenciones) el 11/04/2014 22:26:12
Buenas tardes, no pido que realizen este ejercicio, simplemente me basta con comprender a que se refiere a copiar


1- Escriba un programa que copie caracteres del teclado en la pantalla reemplazando cada
ocurrencia de uno o más espacios por sólo uno. Emplee getchar().

No entiendo muy bien, un ejemplo ayudaria.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Ayuda en la comprensión de este ejecicio.

Publicado por Pico (37 intervenciones) el 12/04/2014 07:46:39
Programa que saque por la pantalla lo que entre por el teclado pero dejando un espacio si hay más de uno seguido
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda en la comprensión de este ejecicio.

Publicado por Diego (85 intervenciones) el 12/04/2014 14:52:56
Creo que lo que quiere es algo así:

ingreso "hola____mundo"; y deveria mostrar "hola_mundo", pero no se bien como hacer eso, ya que cuando ingreso caracter a caracter tambien muestro caracter a caracter osea, quedaria así:
ingreso "h" luego una vez ingresada la muestra luego la "o" y luego la muestra y así luego cuando llegan los espacios en blanco hace una limieza de blancos con un while.
la pantalla quedaria mas o menos asi:

h
h
o
o
l
l
a
a
¿o me equivoco?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda en la comprensión de este ejecicio.

Publicado por Pico (37 intervenciones) el 12/04/2014 15:12:25
Sí, eso parece que quiere.

No haría eso, no. Te han dicho que uses getchar, y esa función pilla lo que haya en el teclado pero no saca nada por la pantalla ni mete retornos del carro. Así que sería pillar con el getchar y comprobar si el carácter anterior era un espacio. Si lo es, no sacar nada; si no lo es, sacar el carácter recién cogido.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda en la comprensión de este ejecicio.

Publicado por Chema (187 intervenciones) el 12/04/2014 17:40:41
Creo que el profesor desea suspender a la totalidad de la clase .
Ingenioso ejercicio, realmente bueno.

getchar() jejejeje.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda en la comprensión de este ejecicio.

Publicado por UnoPorAhi (15 intervenciones) el 12/04/2014 19:48:29
Buenas,

Yo lo acabo de hacer así. He intentado ser bastante explícito:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
const int SPACE_CHAR = 0x20;
const int ENTER_CHAR = 0x0A;
 
int main() {
	char current_char;
	char previous_char;
 
	for (;(current_char = getchar()) != ENTER_CHAR; previous_char = current_char) {
		if (current_char == SPACE_CHAR && previous_char == SPACE_CHAR)
			continue;
		putchar(current_char);
	}
 
	return 0;
}

Aunque no se si es exactamente lo que te piden...


Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda en la comprensión de este ejecicio.

Publicado por Chema (187 intervenciones) el 12/04/2014 20:13:57
Sobra putchar(current_char) , getchar() envía al momento a stdout la entrada de stdint lo cual hace complicado ¿Imposible? evaluar con anterioridad el resultado.

Me parece que no es posible, esa es la gracia de la cuestión, creo que Diego va de cachondeo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda en la comprensión de este ejecicio.

Publicado por UnoPorAhi (15 intervenciones) el 12/04/2014 21:40:40
Buenas,

Yo creo que no sobra. Es precisamente putchar el que escribe el mensaje correcto quitando los espacios múltiples.

La salida del programa queda:
"
hola que tal [multiples espacios] como estas
hola que tal como estas
"

Efectivamente con getchar es imposible tener control sobre la entrada, ya que envía directamente el stdin al stdout como dices (hace echo).

Yo no tengo seguro de que vaya de coña. En sus otras intervenciones ha hecho preguntas en serio. Ya nos lo aclarará :-P


Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda en la comprensión de este ejecicio.

Publicado por Chema (187 intervenciones) el 12/04/2014 22:49:11
Con animo orientativo.

Usando xterm en linux y FreeBSD la salida del ejemplo no corrige el espaciado, putchar(), fprintf (), printf(), sólo se muestran en stdout después de la terminación de putchar().

Puede ser que el ejemplo en windows funcione correctamente, yo uso exclusivamente FreeBSD/linux, no lo puedo comprobar en windows.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda en la comprensión de este ejecicio.

Publicado por Pico (37 intervenciones) el 12/04/2014 23:04:40
http://c.conclase.net/librerias/?ansifun=getchar

Yo lo que le he contado a Diego es lo que hace la función ansi getchar. El cachondeo del profe debe estar en que lo que haga getchar depende del compilador, y los hay que no vuelven hasta el return y hacen echo o que directamente no tienen la función, como el visual studio. Así que si cada alumno usa un compilador distinto estará alguno alucinando, como Diego, que según ha puesto en un post a él sí le hace echo el getchar y no vuelve hasta el return, luego la explicación mía o el ejemplo de UnoPorAhi no le funcionará.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda en la comprensión de este ejecicio.

Publicado por Diego (85 intervenciones) el 13/04/2014 01:09:25
Uf les pido mil disculpas me fui a dormir y parece que se volvió un tema cliente, jaja.
no se si le ssirva pero les dejo los dos ejercicio el 4 , 5 y el 6, en el 6 indica como se supone que es la entrada y como deberia ser la salida.

4. Escriba un programa que lea caracteres del teclado empleando getchar() y los cuente hasta
encontrar EOF. Luego debe imprimir la cantidad de caracteres y líneas encontradas. En
GNU/Linux puede comprobar la funcionalidad con los comandos wc -c y wc -l.
Nota: Puede leer de teclado o invocar el programa con un archivo cómo parámetro. Por
ejemplo:
./ejecutable.bin < archivo_param
Esto hace que el contenido de archivo_param se vea desde el programa ejecutable.bin
como proveniente del teclado.
Notará que si utiliza sólo el teclado, el programa no funcionará hasta que ingrese ENTER.
Esto es propio del manejo de buffers en C.
5. Escriba un programa que copie caracteres del teclado en la pantalla reemplazando cada
ocurrencia de uno o más espacios por sólo uno. Emplee getchar().

6. Escriba un programa que copie caracteres del teclado en la pantalla remplazando cada
ocurrencia de barra invertida por \\, cada tabulación por \t, cada enter por \n. Emplee
getchar().
# Por ejemplo. Si ingresa:
hola mundo
chau mundo\
# Debe imprimir:
hola\tmundo\nchau mundo\\

La parte de usar un archivo como parametro no tengo idea de comorealizarla.
Incluso me puse a pensar en hacerlo con un arreglo o guardarlo en un string (basicamente son lo mismo); pero al ser arreglos supongo que tienen una longitud fija; y yo no sé si lo que ingrese el usuario rebasará la cantidad de espacios disponibles(incluso el del caracter de fin).
Lo que sucede es que todavia no vimos listas sino también podría hacerlo con eso. Lo unico que vimos hasta el momento son datos simples y mencinamos al arreglo.

Les agradezco mucho, voy a probar el código que escribieron y lo analizo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda en la comprensión de este ejecicio.

Publicado por Diego (85 intervenciones) el 13/04/2014 02:22:59
Exelente, acabo de probar el código de "UnoPorAhi" y funciona, voy a analizarlo, Les agrezco mucho por el interés. voy intentar realizarlo por mi cuenta y luego sigo con el 5 y 6 cualquier duda lo planteo en este foro. Muchisimas gracias, aunque no me covece mucho el uso de areglos en algo que no se sabe cuanto espacio ocupará.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda en la comprensión de este ejecicio.

Publicado por UnoPorAhi (15 intervenciones) el 13/04/2014 11:10:42
@Chema
"Usando xterm en linux y FreeBSD la salida del ejemplo no corrige el espaciado"

Pues es raro, porque yo utilizo Ubuntu (GCC 4.8.1) y si me funciona. La salida del putchar efectivamente se produce cuando el getchar termina de leer el teclado, si, pero me corrige los espacios.

Bueno, tampoco importa mucho en realidad. Era sólo un ejemplo chorras. No creo que nadie en el mundo real vaya a corregir una entrada del teclado con getchar...
El caso es que a Diego le sirva por lo menos para orientarse.


Un saludo,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda en la comprensión de este ejecicio.

Publicado por Chema (187 intervenciones) el 13/04/2014 18:08:48
@UnoPorAhi, Estamos en común acuerdo este ejercicio es una chorradilla, sirve para echarnos unas risas y obtener moraleja y moralina.

Efectivamente tu solución es correcta, me olvide que uso una xtern con salida modificada para que tabule datos, disculpa.

Este ejemplo controla cualquier combinación de espacio+ tabulador.
Muchas veces se olvida que un tabulador es un espacio.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
typedef struct String{
	int len;
	char buf[1024];
}String;
 
String string;
 
#define SPC 32
#define TAB 9
 
void CheckSpace(int n){
 
	switch (n){
		case TAB:
			n = SPC; /*No colocar break*/
		case SPC:
			if(string.buf[string.len-1] == SPC)
				return;
	}
 
	if( string.len < 1024){
		string.buf[string.len] =n;
		string.len++;
		string.buf[string.len] = 0x0;
	}
 
}
 
 
int main(void){
	int c;
 
	string.len =0;
 
	while ((c =getchar()) != EOF)
		CheckSpace(c);
 
	printf("\n%s",string.buf);
 
	return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda en la comprensión de este ejecicio.

Publicado por Chema (187 intervenciones) el 14/04/2014 01:58:56
El mismo ejemplo anterior realizado con punteros.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <ctype.h> /*isspace()*/
 
#define BUF_SIZE 20     /*OJO, sólo se admiten 20 caracteres, si quieres más cambia el valor*/
#define KEY_ENTER 10
#define SPC 32
 
int main(void){
	int c;
	char *k,*p,*end;
	char *buf = malloc(BUF_SIZE);
 
	k=p= buf;
	end = buf+BUF_SIZE;
 
	while((c =getchar()) != KEY_ENTER){
 
		if(isspace(c) && isspace(*k) ){
			*k= SPC;
			continue;
		}
 
		if(p < end){
			k=p;
			*p++ = c;
		}
 
	}
 
	if(p >= end)
		 printf("\n Numero de caracteres = que el buffer %lu", p - buf);
 
	 p = 0x0;
 
	printf("\n%s",buf);
 
	free(buf);
 
	return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda en la comprensión de este ejecicio.

Publicado por Chema (187 intervenciones) el 15/04/2014 01:24:06
Otra solución.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <ctype.h> /*isspace()*/
 
#define BUF_SIZE 200
#define KEY_ENTER 10
 
int main(void){
	int c;
	int tic =0;
	int tac = 0;
	char *k,*p,*end;
	char *buf = malloc(BUF_SIZE);
 
	k=p= buf;
	end = buf+BUF_SIZE;
 
	while((c =getchar()) != KEY_ENTER){
		tic = tac;
		isspace(c) ? c= SPC , (tac = 0) : (tac = 1) ;
		 if(tac  || tic ){
		        if(p < end)
			*p++ = c ;
		}
	}
 
	if(p >= end)
		 printf("\n Numero de carateres = que el buffer %lu", p - buf);
 
	 p = 0x0;
 
	printf("\n%s",buf);
	free(buf);
	return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda en la comprensión de este ejecicio.

Publicado por Diego (85 intervenciones) el 15/04/2014 15:48:39
Gracias a todos, por las respuestas ya pude realizarlo, aunque al parecer solo puedo usar stdio.h.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar