Ayuda con arrays

Iniciado por norris, 15 Noviembre 2012, 09:40 AM

0 Miembros y 1 Visitante están viendo este tema.

norris

Hola, era para ver si me podeis ayudar a completar este programa.

Primero me pide desplazar un array: (suponiendo que N sea 10):
DAME 10 ENTEROS: 3 24 7 –25 0 3 21 19 3 895

El array desplazado hacia la IZQUIERDA queda así:
24 7 –25 0 3 21 19 3 895 3

ese le tengo hecho
#include <stdio.h>
#include <stdlib.h>
int main()
{
int t[10],ind,lon,num,aux;

ind=0;
do{
printf ("Introduce un número");
scanf("%d",&num);
t[ind]=num;
ind=ind+1;
}while(ind<10);

/* Al salir del anterior bucle ind está apuntando al 10, es decir,
el número de elementos que tiene el array. Guardamos el primer elemento
sobre aux antes de empezar a desplazar el resto a la izqda. */

lon=ind;
aux=t[0];
printf ("aux %d\n",aux);

/* el indice a 1, cuando desplazamos hacia la izda, empezamos
tomando una posición y asignándoselo a la que está a su izquierda, por eso
empezamos en la segunda posición para asignárselo a la primera*/
ind=1;

/*Bucle para realizar el desplazamiento,  empezamos en ind=1 y acabamos en
ind=long-1*/

while(ind <lon){
t[ind-1]=t[ind];
ind=ind+1;
}

/* En la última posición guardamos lo que había antes en la primera */
t[lon-1]=aux;

/*indice a 0 para implementar el bucle para recorrer e
imprimir la tabla*/

ind=0;
while(ind <lon){
printf("%d\n",t[ind]);
ind=ind+1;
}
system("PAUSE");
}


Ahora me pide que haga lo mismo sólo que esta vez desplazando los elementos hacia la derecha y dejando el último elemento en la primera posición del array.

Ejemplo (suponiendo que N sea 10):
DAME 10 ENTEROS: 3 24 7 –25 0 3 21 19 3 895

El array desplazado hacia la DERECHA queda así:
895 3 24 7 –25 0 3 21 19 3

Gracias de antemano, un saludo

rir3760

Una opción mas fácil es solo aparentar el desplazamiento, para ello puedes utilizar el operador de modulo '%'. Por ejemplo:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   int num[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
   size_t num_elem = sizeof num / sizeof num[0];
   size_t i;
   
   puts("Un desplazamiento a la izquierda:");
   for (i = 0; i < num_elem; i++)
      printf(" %d", num[(1 + i) % num_elem]);
   putchar('\n');
   
   puts("Un desplazamiento a la derecha:");
   for (i = 0; i < num_elem; i++)
      printf(" %d", num[(num_elem - 1 + i) % num_elem]);
   putchar('\n');
   
   return EXIT_SUCCESS;
}


Por supuesto si ello vale (o no) depende del enunciado. El valor 1 se indica en las expresiones solo para enfatizar el desplazamiento.

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

Cita de: norris en 15 Noviembre 2012, 09:40 AM

Ahora me pide que haga lo mismo sólo que esta vez desplazando los elementos hacia la derecha y dejando el último elemento en la primera posición del array.

Ejemplo (suponiendo que N sea 10):
DAME 10 ENTEROS: 3 24 7 –25 0 3 21 19 3 895

El array desplazado hacia la DERECHA queda así:

895 3 24 7 –25 0 3 21 19 3

Si de lo que se trata es de "hacerlo" y no tan solo "simularlo":
Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#define N   10
int main()
{
    int i,aux2;
    int t[N]={3,24,7,-25,0,3,21,19,3,895};
    aux2=t[N-1];
    for (i=N-2;i>=0;i--)
        t[i+1]=t[i];
    t[0]=aux2;
    for (i=0;i<N;i++)
        printf("%d  ",t[i]);
    return EXIT_SUCCESS;
}

Saludos!.

norris

Cita de: leosansan en 15 Noviembre 2012, 20:46 PM
Si de lo que se trata es de "hacerlo" y no tan solo "simularlo":
Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#define N   10
int main()
{
    int i,aux2;
    int t[N]={3,24,7,-25,0,3,21,19,3,895};
    aux2=t[N-1];
    for (i=N-2;i>=0;i--)
        t[i+1]=t[i];
    t[0]=aux2;
    for (i=0;i<N;i++)
        printf("%d  ",t[i]);
    return EXIT_SUCCESS;
}

Saludos!.

Muchas gracias.Me sale bien el programa  Aunque sigo sin entender este ciclo.
for (i=N-2;i>=0;i--)
        t[i+1]=t[i];
    t[0]=aux2;


me podrias indicar que hace.Muchas gracias de antemano y perdon por las molestias

rir3760

Cita de: norris en 15 Noviembre 2012, 21:00 PMAunque sigo sin entender este ciclo.
for (i=N-2;i>=0;i--)
        t[i+1]=t[i];
    t[0]=aux2;


me podrias indicar que hace.Muchas gracias de antemano y perdon por las molestias
El bucle itera con el contador tomando los valores N-2 .. 0, esos son los indices de los elementos con excepción del ultimo. En cada iteracion se copia el elemento "i" en la posición "i + 1". Con ello se copia el penúltimo elemento en el ultimo, el antepenúltimo en el penúltimo, etc. con ello se da el efecto de desplazamiento.

El ultimo paso es copiar el ultimo elemento en la primera posición (almacenado previamente en la variable auxiliar):
t[0]=aux2;

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

#5
Cita de: norris en 15 Noviembre 2012, 09:40 AM

Primero me pide desplazar un array: (suponiendo que N sea 10):
DAME 10 ENTEROS: 3 24 7 –25 0 3 21 19 3 895

El array desplazado hacia la IZQUIERDA queda así:
24 7 –25 0 3 21 19 3 895 3
De forma parecida tendrías:
Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#define N   10
int main()
{
   int i,aux1;
   int t[N]={3,24,7,-25,0,3,21,19,3,895};
   aux1=t[0];
   for (i=1;i<N;i++)
       t[i-1]=t[i];
   t[N-1]=aux1;
   for (i=0;i<N;i++)
       printf("%d  ",t[i]);
   return EXIT_SUCCESS;
}

Saludos!.

norris


norris

Hola de nuevo. Perdon por mi insitencia pero es que esto de desplazar vectores me esta costando bastante.

Ahora estoy haciendo un programa que me pide Pedir al usuario una serie de números y almacenarla en un array de tamaño N y una vez se dispone del array con como mucho N números, se pide intercambiar el menor de ellos con el que está en la primera posición.

por ejemplo, DAME HASTA 10 NUMEROS:
45 67 13 29 3 28 32 51

El array, una vez realizado el intercambio, queda así:
3 67 13 29 45 28 32 51

he hecho una parte del programa, en esta parte el programa me haya el numero menor. Pero mi problema viene a la hora de intercambiar el numero menor con el primer numero de la serie. Lo he intentado con un auxiliar para intercambiar los valores pero no me sale.

#include<stdio.h>
#include<stdlib.h>


int main()
{ int numeros [10],i,x,c,aux;
int mayor,menor;
for(i=0;i<10;i++)
{printf("Dame el elemento de la posicion:");
scanf("%d",&numeros[i]);

}
mayor=numeros[0];
for(x=0;x<10;x++)
{
if (numeros[x]>mayor)
mayor=numeros[x];
}

menor=numeros[0];
for(c=0;c<10;c++)
{
if (numeros[c]<menor)
menor=numeros[c];
}
printf("\nEl mayor es %d",mayor);
printf("\nEl menor es %d",menor);



system("PAUSE");
}


Gracias de antemano, y perdon por ser tan pesado pero es que no termino de pillar lo del desplazamiento.

durasno

Hola! para intercambiar los numeros tenes que tener una variable que guarde la posicion del menor numero, luego con esa posicion haces el intercambio en el arreglo


Saludos
Ahorrate una pregunta, lee el man

leosansan

Justo lo que te indica Durasno, y como por otros post veo que se te atragantan los intercambios en un array te dejo esto:
Código (cpp) [Seleccionar]

#include<stdio.h>
#include<stdlib.h>
#define N   8

int main()
{
    int numeros[N]={45,67,13,29,3,28,32,51},i,x,c,aux,indice;
    int mayor,menor;
    /*for(i=0;i<10;i++) {
         printf("Dame el elemento de la posicion %d:",i);
        scanf("%d",&numeros[i]);
    }*/
    menor = numeros[0];
    for(c=0;c<N;c++) {
        if (numeros[c]<menor)
        {menor=numeros[c]; indice=c;}
    }
    aux=menor;
    numeros[indice]=numeros[0];
    numeros[0]=menor;
    for(c=0;c<N;c++) {
        printf("%d  ",numeros[c]);
    }
    return 0;
}

Saludos!.