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

problemas con punteros

Estas en el tema de problemas con punteros en el foro de C/C++ en Foros del Web. hola a toodos este programa se supone que tiene que leer una cadena luego poer un punto de origen de la cadena y de ahi ...
  #1 (permalink)  
Antiguo 06/10/2009, 21:39
 
Fecha de Ingreso: octubre-2009
Mensajes: 19
Antigüedad: 15 años, 1 mes
Puntos: 0
problemas con punteros

hola a toodos este programa se supone que tiene que leer una cadena luego poer un punto de origen de la cadena y de ahi extrar una cantidad de caracteres

digamos que si pongo yo
esta cadena
y le digo que se posicione en 2 y que extraiga 5
quedaria
ta ca
y si fuera en nueros negativos empezara del final al principio
ejej la cosa es que no lo hace y no se como funcionan en si los punteros
include <stdio.h>
#include <conio.h>
#include <string.h>
#define max 50
int po,extrac,lcf,i;
char *por;
void main (){
char cadprincipal[max], cadfinal[max];
char *carac=cadfinal;
printf("\tUtilizando apuntadores, realice una función que extraiga\n una sub-cadena de una cadena a partir de una posición determinada\n\t(el resultado debe quedar en otra cadena)");
printf("\n\nDigita la cadena princial : ");
gets(cadprincipal);
printf("Digita la posicion del caracter: ");
scanf("%d", &po);
printf("Digita el numero de caracteres que se extraeran: ");
scanf("%d", &extrac);
if (po>=0){
por=&cadprincipal[po];
}
for(;*carac++;*por++){
*carac=*por;
}
printf("\n\nCadena principal: %s",cadprincipal);
printf("\nCadena final: %s",por);
getch();
}

hoajal me puedan ayudar a entender el uso de los punteros porfavor gracias
  #2 (permalink)  
Antiguo 06/10/2009, 23:05
 
Fecha de Ingreso: septiembre-2009
Mensajes: 56
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: problemas con punteros

Ahí le doy un arreglo al código:

Código:
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define max 50
int po,extrac,lcf,i;
char *por;
int main (){
   char cadprincipal[max], cadfinal[max];
   char *carac=cadfinal;
   printf("\tUtilizando apuntadores, realice una función que extraiga\n una sub-cadena de una cadena a partir de una posición determinada\n\t(el resultado debe quedar en otra cadena)");
   printf("\n\nDigita la cadena princial : ");
   gets(cadprincipal);
   printf("Digita la posicion del caracter: ");
   scanf("%d", &po);
   printf("Digita el numero de caracteres que se extraeran: ");
   scanf("%d", &extrac);
   
   if (po>=0){
      por=&cadprincipal[po];
   }
   
   int abs;
   
   if(extrac >= 0) abs = extrac;
   else abs = -extrac;
   
   for(int i=0;i<abs;i++,carac++){
         *carac=*por;
         if(extrac >=0) por++;
         else por--;
   }   
   
   *carac = 0;
   carac -= abs;
          
   printf("\n\nCadena principal: %s",cadprincipal);
   printf("\nCadena final: %s",carac);
   getch();
   return 0;
}
Si se fija bien cambié unas cositas:
- en el último printf usted imprimía "por", lo cambié por "carac" porque ahí es donde está almacenando cada uno de los caracteres de la subcadena
- El for que había antes no tenía condicional de salida. Cambié todo ese for, de tal forma que lo recorriera "extrac" veces y fuera asignando en "carac" cada uno de los caracteres según fuera "extrac" positivo o negativo (substring hacia adelante o hacia atrás).
- Usé una variable adicional llamada "abs" donde guardo el valor absoluto de "extrac".


Habría muchas cosas para explicar sobre los punteros, si tiene alguna duda en específico no dude en preguntar.
Saludos.
  #3 (permalink)  
Antiguo 07/10/2009, 13:56
 
Fecha de Ingreso: octubre-2009
Mensajes: 19
Antigüedad: 15 años, 1 mes
Puntos: 0
woowww gracias

#include <stdio.h>
#include <conio.h>
#include <string.h>
#define max 50
int po,extrac,lcf,i;
char *por;
int main (){
char cadprincipal[max], cadfinal[max];
char *carac=cadfinal;
printf("\tUtilizando apuntadores, realice una función que extraiga\n una sub-cadena de una cadena a partir de una posición determinada\n\t(el resultado debe quedar en otra cadena)");
printf("\n\nDigita la cadena princial : ");
gets(cadprincipal);
printf("Digita la posicion del caracter: ");
scanf("%d", &po);
printf("Digita el numero de caracteres que se extraeran: ");
scanf("%d", &extrac);

if (po>=0){
por=&cadprincipal[po];
}

int abs;

if(extrac >= 0) abs = extrac;
else abs = -extrac;

for(int i=0;i<abs;i++,carac++){
*carac=*por;
if(extrac >=0) por++;
else por--;
}

*carac = 0;
carac -= abs;

printf("\n\nCadena principal: %s",cadprincipal);
printf("\nCadena final: %s",carac);
getch();
return 0;
}

GRACIAS POR LA AYUDA!!!!!!!!!!!!!!!!!

Estoy checando el programa que me corriges muchas gracias pero no encuentro que hace la sintaxis o funcion abs y una pregunta donde puede encontrar progrmas donde manejen diferentes tipos de punteros asi como ejerccios donde yo los pueda realisar y tratar de ser mejor en progrmacion c++ con punteros proximamnte me estan dejando un programa que utilice una pila pero la informacion que me dan es muy vaga alguin sabe donde puedo encontrar dicha informacion pero explicado paso a paso
  #4 (permalink)  
Antiguo 07/10/2009, 14:28
Avatar de r0d
r0d
 
Fecha de Ingreso: noviembre-2007
Mensajes: 86
Antigüedad: 17 años
Puntos: 3
Respuesta: woowww gracias

Cita:
Iniciado por angelperdido Ver Mensaje
[...] y tratar de ser mejor en progrmacion c++
Cuidado, porque todo este código es C, no es C++. Son dos lenguajes muy distintos.
__________________
Alicia: Sólo quiero saber que camino debo tomar.
Gato risón: Pues... depende mucho de donde quieras ir.

Mi página web
  #5 (permalink)  
Antiguo 07/10/2009, 21:03
 
Fecha de Ingreso: septiembre-2009
Mensajes: 56
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: problemas con punteros

Hola,
la variable "abs" la usé para poder hacer el contador del for cuando extrac es negativo. Suponiendo que:
- extrac=5, entonces abs=5 y el for se hace de 0 a 5
- extrac= - 5, entonces abs=5 y de igual forma el for hace un conteo hasta 5, que es lo que quiero, simplemente que ya como extrac es negativo recorro el arreglo alrevés pero de todas formas lo hago 5 veces. Por eso uso el abs, para tomar el valor absoluto.

A continuación pongo el código otra vez, con algunas líneas comentadas para explicar lo que se hace.

Código:
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define max 50
int po,extrac,lcf,i;
char *por;
int main (){
   char cadprincipal[max], cadfinal[max];
   char *carac=cadfinal;
   printf("\tUtilizando apuntadores, realice una función que extraiga\n una sub-cadena de una cadena a partir de una posición determinada\n\t(el resultado debe quedar en otra cadena)");
   printf("\n\nDigita la cadena princial : ");
   gets(cadprincipal);
   printf("Digita la posicion del caracter: ");
   scanf("%d", &po);
   printf("Digita el numero de caracteres que se extraeran: ");
   scanf("%d", &extrac);
   
   if (po>=0){
      /* en el puntero "por" se guarda la dirección
       * de memoria del caracter de donde se va
       * a empezar a extraer la subcadena
       */
      por=&cadprincipal[po];
   }
   
   int abs;
   
   if(extrac >= 0) abs = extrac;
   else abs = -extrac;
   

   /* a continuación se hace un proceso
    * "abs" veces
    * no se hace "extrac" veces, porque
    * éste puede ser negativo
    */
   for(int i=0;i<abs;i++,carac++){

         /* dentro de cada una de las
          * posiciones de "carac" se va
          * poniendo lo que apunta "por"
          */

         *carac=*por;

         /* si "extrac" es positivo, entonces
          * aumento "por" para caminar hacia adelante
          * si "extrac" es negativo, entonces
          * disminuyo "por" para caminar hacia atrás
          */
         if(extrac >=0) por++;
         else por--;
   }   

   //pongo el caracter NULL, que indica fin de cadena   
   *carac = 0;

   /*como el puntero "carac" lo estuve moviendo en el for
    *lo devuelvo a donde apunta el inicio de cadena
    */
   carac -= abs;
          
   printf("\n\nCadena principal: %s",cadprincipal);
   printf("\nCadena final: %s",carac);
   getch();
   return 0;
}
Te recomiendo la siguiente página, ahí hay un buen curso de programación. Dejo el link de "punteros".
http://c.conclase.net/curso/index.php?cap=012

Saludos.
  #6 (permalink)  
Antiguo 09/10/2009, 21:52
 
Fecha de Ingreso: octubre-2009
Mensajes: 19
Antigüedad: 15 años, 1 mes
Puntos: 0
De acuerdo Respuesta

gracias por tu ayuda
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 13:47.