Invertir un arreglo de enteros en lenguaje C.-

Iniciado por NOB2014, 14 Enero 2014, 22:00 PM

0 Miembros y 2 Visitantes están viendo este tema.

NOB2014

Hola.
Esto debe ser sencillo pero no logro resolverlo, el caso es que no  me acepta esta línea de código.-

//for(i=longitud; i>=0; i--,j++)

Me da el siguiente error, no al compilar sino al ejecutar.-



#include <stdio.h>
#include <string.h>

int main(void){
unsigned int enteros[]={15,12,28,18,05,33,21},i=0, longitud=0, copia[7], j=0;
longitud = sizeof enteros / sizeof *enteros;

printf("\n Original....:");
for(i=0; i<longitud; i++){
printf("%d ", enteros[i]);
}

//for(i=longitud; i>=0; i--,j++){
for(i=longitud; i>0; i--,j++){
copia[j] = enteros[i];
}

printf("\n\n Invertido...:");
for(i=0; i<longitud; i++){
printf("%d ", copia[i]);
}

return 0;
}


Bueno espero de vuestra ayuda.-       
Saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

do-while

¡Buenas!

En el segundo bucle, el primer índice es longitud, que está fuera de rango. Debería ser longitud - 1, y la condición de continuidad del for debería ser i >= 0

Cámbialo y nos cuentas como va.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

ivancea96

El problema es que pusiste unsigned int.

¿Qué número POSITIVO no es mayor o igual a 0?
O pones i<longitud+1 o pones int en vez de unsigned int.

amchacon

Cita de: ivancea96 en 14 Enero 2014, 22:13 PM
El problema es que pusiste unsigned int.

¿Qué número POSITIVO no es mayor o igual a 0?
O pones i<longitud+1 o pones int en vez de unsigned int.
Un consejo NOB2014, no uses variables unsigned si tienes que hacer condiciones. Puede provocar errores extraños si te despistas.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

NOB2014

Hola.

Citar¿Qué número POSITIVO no es mayor o igual a 0?
O pones i<longitud+1 o pones int en vez de unsigned int.

De acuerdo, inocente error el mío, i<longitud+1 no me funciona.
Quitando unsigned si.-

Gracias a los tres.- 
Saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

NOB2014

Hola.
Una consulta más, ¿tiene sentido hacer este mismo código con punteros teniendo en cuenta que el nombre de un arreglo es un apuntador, o el nombre de un arreglo es la dirección del primer elemento que contiene el arreglo?.-
Si esto es conveniente necesitaría toda la teoría posible porque estoy estudiando apuntadores y nunca pude resolver esta incógnita, y además ¿sería más conveniente con arreglos de punteros?.- 

Saludos y gracias.-
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

ivancea96

I<longitud*
Es la forma q veo para usar unsigned.

Enviado desde mi ST21i mediante Tapatalk

rir3760

Cita de: NOB2014 en 14 Enero 2014, 23:12 PM¿tiene sentido hacer este mismo código con punteros
Ya los estas utilizando. El operador "[]" es uno binario y requiere que uno de sus operandos (no importa cual) sea un puntero.

Cita de: NOB2014 en 14 Enero 2014, 23:12 PMteniendo en cuenta que el nombre de un arreglo es un apuntador, o el nombre de un arreglo es la dirección del primer elemento que contiene el arreglo?
No exactamente.

El identificador de un array usualmente resulta en la dirección en memoria de (un puntero a) su primer elemento, por ejemplo al utilizar los operadores "[]" y "*". En tu caso:
copia[j] = enteros[i];

/* La forma equivalente utilizando el operador "*": */
*(copia + j) = *(enteros + i);


Una de las excepciones es el operador sizeof, en tu caso:
longitud = sizeof enteros / sizeof *enteros;
Da el resultado correcto porque la primera instancia de "enteros" denota (referencia) al array y resulta en el numero de bytes utilizados para almacenarlo.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

leosansan

#8
Cita de: NOB2014 en 14 Enero 2014, 23:12 PM
Hola.
.............................
¿tiene sentido hacer este mismo código con punteros?
.............................................................

Como apunto rir3760 ya lo estas haciendo.

Pero para que quede todo como punteros en lugar de declarar la variable copia como un array, tal vez sería más propio, que no obligatorio, declarala como como puntero directamente.

Vamos que en lugar de :


Código (cpp) [Seleccionar]

   int .....copia[7]...


hacerlo como:

Código (cpp) [Seleccionar]

   .......................................
   int  *copia;
   longitud = sizeof enteros / sizeof (enteros[0]);
   copia = malloc(longitud*sizeof (int));
   ....................................
       *(copia + j) = *(enteros + i);
   .....................................
   free(copia);
   return 0;
}


Lo del enteros[0] es por complementar.

¡¡¡¡ Saluditos! ..... !!!!




NOB2014

Hola.
Muchas gracias a ambos, que lastima que todavía no llegué a estudiar memoria dinámica, creo que viene más allá de los apuntadores.-

Saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-