You are on page 1of 6

1.12 Escriba un programa que imprima su entrada una palabra por línea.

________________________________________________________________________________
______________
SOLUCIÓN: Este programa recibe la cadena y la imprime palabra por línea, para hacer esto se usa
las funciones getchar() y putchar(). El único punto en el que puede haber confusión es con el uso de
la variable 'anterior', que controla los saltos de línea: si ya se ha cambiado y no se imprimió nada,
entonces no se debe de saltar más. Si hay dos o más espacios en blanco '', tabuladores '\t' o saltos de
línea '\n' consecutivos, se considera como si se tratara de uno sólo. Es bueno ejecutar este programa
con un archivo de texto como entrada para apreciar lo anterior.
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* *
* *
* ESTE PROGRAMA RECIBE UNA CADENA DE CARACTERES Y LA IMPRIME PONIENDO *
* CADA PALABRA EN UNA LINEA DISTINTA *
* *
* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* +
* ALGORITMO: +
* Pedir una cadena de caracteres al usuario +
* Recibir la cadena caracter por caracter +
* Si el caracter recibido es distinto a un espacio en blanco ' ', '\t' o salto de linea+
* '\n', imprimir el caracter +
* De lo contrario: si no has hecho un salto de linea, cambiar de linea +
* Si ya se ha hecho un salto de linea, entonces permanece en la linea actual +
*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

# include <stdio.h>

/*////////////////////////////////////////////////////////
// main
/////////////////////////////////////////////////////////*/

int main()
{ // Abre main
int c;
int anterior = 'b'; /*Esta variable controla los saltos de linea
inicialmente se considera que ya se ha hecho un salto, y por lo tanto
hay que escribir en la linea actual */

printf("\nEste es un programa que recibe una cadena como entrada y da como salida la misma");
printf(" cadena escribiendo cada palabra en una linea distinta.\n");
printf("\nEOF para terminar.\n\n");

while ((c = getchar()) != EOF)


{ /* Abre while */

if ( ' ' != c && '\n' != c && '\t' != c)


{ /*Abre if*/
anterior = 'l';
putchar(c);
} /*Cierra if*/
else
{ /* Abre else */
if ( 'l' == anterior ) /*Si no se ha cambiado de linea*/
{ /*Abre if*/
printf("\n");
anterior = 'b'; /*Indica que ya se ha cambiado de linea*/
} /* Cierra if */
}
} /* Cierra while */

} /* Cierra main */

1.13a Escriba un programa que imprima el histograma de las longitudes de las palabras de su entrada. Es fácil dibujar el histograma con las barras
horizontales; la orientación vertical es un reto más interesante. (La versión de este programa con el histograma vertical aparece en la siguiente
entrada).

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Este programa imprime un histograma con las longitudes de las palabras de su +
+ entrada +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ ALGORITMO: +
+ DATOS: +
+ Un arreglo de tamanio Tamano_Arreglo (El numero de palabras del texto de +
+ entrada) +
+ Una variable llamada numero_palabra (recorrera las posiciones del arreglo) +
+ Nota: Para evitar la posicion 0, se incrementa en 1 el tamanio del +
+ arreglo +
+ y la variable numero_palabra se inicia en 1 +
+ +
+ +
+ Arreglo: +
+ | 0 | 1 | 2 | 3 | 4 | 5 | 6 |........|Tamano_Arreglo + 1| +
+ | +
+ | +
+ numero_palabra = 1 (El numero de palabra empieza en 1 ) +
+ +
+ Inicialmente las posiciones del arreglo son llenadas con 0 (no hay letras +
+ en ninguna palabra) +
+ +
+ +
+ PROCEDIMIENTO: +
+ +
+ Recibe Un caracter +
+ Mientras el caracter leido sea distinto de EOF (fin de archivo) +
+ Si el caracter es tabulador, espacio o linea +
+ cambia de poscion en el arreglo (pasa a la siguiente posicion del arreglo) +
+ Si el caracter es distinto de tabulador, espacio o linea +
+ Incrementa el contador de palabras del arreglo +
+ Lee el siguiente caracter +
+ +

+ +
+ Imprimir: +
+ Recorre cada localidad del arreglo +
+ Impime tantos asteriscos como lo diga el número que almacena cada posicion +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

#include <stdio.h>
#define Tamano_Arreglo 100

main()

{
printf("\nIntroduzca una cadena y se imprimira un histograma con el numero de caracteres.\n");
printf(" de cada palabra.\n");

int c; /*Se leera caracter por caracter.*/


int i; /* i es el contador del ciclo for */
int s; /* s es el contador de un ciclo for */
int numero_palabra = 1; /* Se asume como uno el contador de palabras */
int caracteres[Tamano_Arreglo + 1] = { 0, 0 }; /*Al inicializar a 0 los
primeros elementos del arreglo se inicializan todos. */

while ( (c = getchar()) != EOF)


{
if( c == '\t' || c == '\n' || c == ' ' )
/* Si se encuentra un espacio, entonces se considera que se ha iniciado
una nueva palabra */
{
numero_palabra++;
}
else
caracteres[numero_palabra]++;

/* Si no es un espacio, se incrementa el numero de caracteres de la palabra


actual */
}

printf("\n\n");
printf("\n\n");

for ( s = 1; s <= numero_palabra; s++ )


{
for ( i = 1; i <= caracteres[s]; i++ )
{
printf("*");
}

printf("\n");
}

printf("\n");

return;
}

1.13b Escriba un programa que imprima el histograma de las longitudes de palabras de su entrada. Es fácil dibujar el histograma con las barras
horizontales; la orientación vertical es un reto más interesante.
_____________________________________________________________________________________
Solución:
Este programa recibe una cadena de caracteres, cuenta la frecuencia de los caracteres de cada palabra y los imprime como un histograma vertical. Esta
versión es un poco más difícil de hacer que la anterior, Kernighan_Ritchie_1.13 en la cual el histograma se imprime horizontalmente:

Introduzca una cadena y se imprimira un histograma con el numero de caracteres.


de cada palabra (ctl D) para terminar
Esta es una cadena para probar el programa
Numero de palabra es: 8

*
*
* * *
* * *
* * * * *
* * * * * *
* * * * * * * *
* * * * * * * *

/* Este programa imprime el histograma de las longitudes de las palabras de su entrada*/

#include <stdio.h>
#define Tamano_Arreglo 100

main()
{
printf("\nIntroduzca una cadena y se imprimira un histograma con el numero de caracteres.\n");
printf("de cada palabra (ctl D) para terminar\n");

int c; //Se leera caracter por caracter.


int i; // i es el contador del ciclo for (aparentemente no se puede
//definir dentro del cilo for)
int s; // s es el contador de un ciclo for
int numero_palabra = 1; // Se asume como uno el contador de palabras
int longitud_palabra_mas_larga = 0;
int palabra_mas_larga = 0;
int caracteres[Tamano_Arreglo + 1] = { 0, 0 }; //Al inicializar a 0 los

// primeros elementos del arreglo se inicializan todos.

while ( (c = getchar()) != EOF)


{
if( c == '\t' || c == '\n' || c == ' ' )

/* Si se encuentra un espacio, entonces se considera que se ha iniciado


una nueva palabra */

{
if (longitud_palabra_mas_larga < caracteres[numero_palabra])
{
longitud_palabra_mas_larga = caracteres[numero_palabra];
palabra_mas_larga = numero_palabra;
}
numero_palabra++;
}
else
caracteres[numero_palabra]++;

// Si no es un espacio, se incrementa el numero de caracteres


// de la palabra actual

printf("Numero de palabra es: %d ", numero_palabra - 1);


printf("\n\n");
for ( s = longitud_palabra_mas_larga; s >= 1; s-- )
{
for ( i = 1; i <= numero_palabra; i++ )
{
if ( caracteres[i] >= s )
printf("* ");
else
printf(" ");
}

printf("\n");

printf("\n");
return 0;
}

1.14 Escriba un programa que imprima el histograma de las frecuencias con que se presentan diferentes caracteres leídos a la entrada.
_____________________________________________________________________________________
Solución:
Éste programa presenta las frecuencias de cada uno de los caracteres leídos del teclado, siempre que
se trate del código ASCII. En el programa aparece el algoritmo en seudocódigo. A pesar de que la
mayoría de los 256 caracteres del código ASCII no serán usados en un texto ordinario, hay que estar
conscientes de que éste programa los presenta con la función putchar y a continuación tantos
asteríscos (*) como veces haya ocurrido el carácter. Por ejemplo, la frecuencia de los saltos de línea
se presentan como un espacio en blanco y debajo, en la siguiente línea, los asteríscos.

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Este programa imprime el histograma de las frecuencias con que se +
+ presentan diferentes caracteres leidos de la entrada +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ +
+ Algoritmo: +
+ Contar: +
+ Recibe el primer caracter y asignalo a la variable c +
+ Si el caracter es distinto de EOF, incrementa en 1 la frecuencia de +
+ dicho caracter +
+ Recibe el siguiente caracter y asignalo a la variable c +
+ Si el caracter es distinto de_EOF, incrementa en 1 la frecuencia de +
+ dicho caracter +
+ Realizar los pasos anteiores hasta que el archivo leido sea EOF +
+ +
+ +
+Imprimir: +
+ Revisa la frecuencia del caracter ASCII 0 +
+ Si la frecuencia es distinta de 0, imprime el caracter y su +
+ frecuencia +
+ Revisa la frecuencia de los sucesivos caracteres ASCII hasta el 255 +
+ Si la frecuencia es distinta de 0, imrpime el caracter y su +
+ frecuencia. +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

#include <stdio.h>
#define Tamano 256 /* El conjunto de caracteres ASCII va de 0 - 255 */

int main()
{ /* Abre main */
/* Recibe los caracteres uno a uno */
printf("\nIntroduzca una cadena de caracteres y le dare ");
printf("la frecuencia con la que ocurre cada uno de ellos.\n\n");

int c; // La variable caracter


int frecuencia_caracteres[Tamano + 1] = { 0, 0, 0 };
int i = 0;
int s = 0;
int t = 0;

while (( c = getchar()) != EOF )


{ /*Abre while */
frecuencia_caracteres[c]++;
} /*Cierra while */

/* Imprime el histograma de las frecuencias de los caracteres */

for ( s = 0; s <= Tamano; s++)


{
if (frecuencia_caracteres[s] != 0 )
{ /*Abre if */
putchar(s);

for ( t = 1; t <= frecuencia_caracteres[s]; t++)


printf("*");

printf("\n");
} /*Cierra if*/
}

return 0;
} /* Cierra main */

1.15 Escriba de nuevo el programa de conversión de temperatura de la sección 1.2, de modo que utilice una función para la conversión.
_______________________________________________________________________________
Solución:
Este programa presenta una tabla de equivalencia entre grados Fahrenheit y grados Celcius.

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Este programa imprime una tabla de equivalencias entre +
+ grados fahrenheit y gradps celsius +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ +
+ ALGORITMO: +
+ Celsius = (5/9)*(Fahrenheit - 32) +
+ +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

#include<stdio.h>

int convertir( int);

/*////////////////////////////////////////////////////////
// MAIN
////////////////////////////////////////////////////////*/

main()
{ /*Abre main */

float fahr, celsius;


int lower, upper, step;
lower = 0;
upper = 300;
step = 20;
fahr = lower;

printf("\nEste programa imprime una tabla de equivalencias entre");


printf(" grados Fahrenheit y grados Celcius\n");
printf("\nFahrenheit: Celsius:\n");

while ( fahr <= upper )


{ /* Abre while */
celsius = convertir( fahr);
printf("%10.0f%11.1f\n", fahr, celsius );
fahr = fahr + step;
} /* Cierra while */

return;
} /*Cierra main */

/*//////////////////////////////////////////////////////
// CONVERTIR
//////////////////////////////////////////////////////*/
int convertir( int fahrenheit )

{ // Abre convertir
return (5.0/9.0)*(fahrenheit - 32);
} // Cierra convertir

1.16

#include <stdio.h>

int main()

{ //Abre main

int i = 0;
char Cadena[] = "corazones";
int c;
printf("\nIntroduzca cadena: ");
while( (c = getchar()) != EOF )
{
Cadena[i++] = c;
}
} // Cierra main

http://clc-wiki.net/wiki/K%26R2_solutions:Chapter_1:Exercise_12

http://www.learntosolveit.com/cprogramming/Ex_1.9_SinBlank.html

https://stackoverflow.com/questions/3305735/kr-exercise-1-9-c

You might also like