Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Manejo de caracteres escalonadamente

Estas en el tema de Manejo de caracteres escalonadamente en el foro de C/C++ en Foros del Web. Hola a todos, me gustaria que me ayudaran en el siguiente problema. Estoy intentando crear un pequeño programa que me imprima de manera escalonada una ...
  #1 (permalink)  
Antiguo 16/11/2010, 08:38
 
Fecha de Ingreso: noviembre-2009
Mensajes: 23
Antigüedad: 14 años, 5 meses
Puntos: 0
Manejo de caracteres escalonadamente

Hola a todos, me gustaria que me ayudaran en el siguiente problema. Estoy intentando crear un pequeño programa que me imprima de manera escalonada una cadena de caracteres, eso es, si escribo GUSTAVO, el programa me debe de devolver en la pantalla las siguientes salidas:
gustavo
ustavo
stavo
tavo
avo
vo
o

g
gu
gus
gust
gusta
gustav
gustavo

o
vo
avo
tavo
stavo
ustavo
gustavo

Yo he realizado el siguiente programa:
#include <stdio.h>
#include <conio.h>
#include <string.h>

int main() {
int i, j, cont;
char nombre[80], tem[80];
printf("\n Introduzca su nombre: ");
scanf("%s", nombre);

cont = strlen(nombre);


for(i = cont; i >= 0; i--) {
strcpy(tem,nombre);
tem[i] = '\0';
printf("%s\n", tem);
}
//}
getch();
return 0;
}

El programa, necesita ser utilizada, algunas de las funciones de manipulación de caracteres. También la misma aplicación deberá de mostrar el nombre invertido en forma escalonada, así por ejemplo si escribo Gustavo, como entrada, la aplicación deberá aparece impresa:

ovatsug
ovatsu
ovats
ovat
ova
ov
o

Les agradezco de antemano la atención brindada..
  #2 (permalink)  
Antiguo 16/11/2010, 11:34
 
Fecha de Ingreso: octubre-2010
Ubicación: Edo. de México
Mensajes: 94
Antigüedad: 13 años, 6 meses
Puntos: 9
Respuesta: Manejo de caracteres escalonadamente

Relmente no es necesario el uso de funciones para alterar cadenas para realizar este programa, lo único que necesitas es hacerte una funcion para invertir tu cadena y realizar un par de print's.

Por ejemplo, digamos que tengo la cadena "MiCadenaMediana", y solo quiro imprimir a partir del elemento número 5, entonces debería aparecer "denaMediana", esto lo puedes hacer aprocvechando las propiedades de los apuntadores.

Como sabemos, una cadena, no es mas que un arreglo de chars, donde tu identificador es un apuntador al primer elemento de la cadena.

Código:
char cadena[100];
Cadena en este caso es el nombre de tu apuntador.

Cuando tu haces algo como:

Código:
printf("%s", cadena);
al encontrar la etiqueta %s, printf busca un apuntador al inicio de la cadena, el cual no precisamente tiene que ser el primer elemento de una cadena, por ejemplo si nosotros hacemos algo como:

Código:
printf("%s", cadena + 4);
Le estamos pasando un apuntador a una cadena, que es lo que pide printf, pero este apuntador ahora apunta al 5to elemento de esta cadena (recordando que el indice 0 es el primer elemento). por lo que esto tendra el resultado que queriamos, imprimir "denaMediana".

Ahora el problema que sigue, como imprimo solo n caractereS?, bueno eso es muy sencillo .
Cuando usamos printf podemos indicar la longitud del campo que queremos imprimir, y la precision, como este no es un curso completo de printf si no una respuesta concreta, me limitare a explicar la precision que es lo que necesitamos en este caso.

La precision indica el numero maximo de caracteres que imprimira de un campo (vease la pagina de la seccion 3 del man de la funcion printf para mayores referencias). Para indicar la precision hacemos lo siguiente, "%.ns". donde n es el numero de elementos MAXIMOS que queremos que imprima de nuestra cadena, de hecho se puede utilizar con cualquier tipo de dato, pero en nuestro caso concreto lo haremos con cadenas. Entonces si hago lo siguiente:
Código:
printf("%.4s", cadena);
Imprimiremos "MiCa", esto implicaria multiples printf's para imprimir toda la piramide
Código:
printf("%.1s\n", cadena);
printf("%.2s\n", cadena);
printf("%.3s\n", cadena);
printf("%.4s\n", cadena);
.
.
.
printf("%.ns\n", cadena); //n-simo elemento
pero por fortuna hay una forma mas "dinamica" de realizar lo anterior, el caracter especial * se puede utilizar tanto para modificar la presicion como la longitud del campo. entonces podemos tener algo como lo siguiente,

Código:
printf("%.*s", miPresicion, cadena);
El caracter especial * toma su valor de uno de los valores pasados a la funcion printf como si se tratase de cualquier otra etiqueta (%i por ejemplo). tanto la presicion como la longitud deben de ser un numero entero.

Entonces para tener el mismo efecto que el ultimo ejemplo, haremos lo siguiente.
Código:
printf("%.*s", 4, cadena);
y tambien imprimira "MiCa".
Espero haberte ayudado

Saludos++
  #3 (permalink)  
Antiguo 17/11/2010, 07:49
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Manejo de caracteres escalonadamente

Considerando que parece un ejercicio de clase, creo que la idea es simplemente usar bucles for y jugar con los índices. Ni siquiera debería ser necesario usar funciones de cadenas.

Recordá que una cadena es un vector de caracteres, y que cada elemento del vector puede ser accedido por su índice, o alternativamente manejado como puntero:

Código C:
Ver original
  1. char* cadena = "Hola";
  2. printf("%s\n", cadena+1);
  3. // resultado: "ola"

Etiquetas: caracteres, manejo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:41.