Saludos estoy haciendo el siguiente código que me tiene que leer un vector de longitud n ordenado ascendente y un elemento x del mismo tipo que los
elementos del vector, intercalar x en el vector v de manera que siga ordenado.
todo esto sin utilizar funciones, solo arreglos
y llevo lo siguiente pero mi problema es en la parte que me tiene que intercalar el elemento x en el vector que no se si esta bien hecha
#include <stdio.h>
#include <stdlib.h>
#define MAX 20
/* Leer un vector de longitud n ordenado ascendente y un elemento x del mismo tipo que los
elementos del vector, intercalar x en el vector v de manera que siga ordenado.
*/
int main()
{
int n,i,j,v[MAX],aux,x;
printf("Dame longitud del vector\n");
scanf("%d",&n);
printf("Imprimir vector\n");
for(i=0;i<n;i++)
{
printf("Imprimir elemento %d\n",i);
scanf("%d",&v[i]);
}
printf("Orden ascendente\n");
for(j=0;j<n;j++)
{
for(i=0;i<n;i++)
{
if(v[i+1]>v[i])
{
aux=v[i+1];
v[i+1]=v[i];
v[i]=aux;
}
}
}
for(i=0;i<n;i++)
{
printf("%d\n",v[i]);
}
printf("Dame elemento a intercalar\n");
scanf("%d",&x);
for(i=0;i<=n;i++)//Aqui le estoy creando una posicion mas al arreglo
{
if(x > v[i])
{
for(j=n;j>v[i];j--)
{
v[j]=v[j-1];/*Aqui recorro los elementos para insertar
el elemento x*/
}
}
}
return 0;
}
me falta todavia la parte en la que se inserta el elemento x en la posicion correcta sin desordenar el vector
gracias
Hola.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[]) {
int *vec, n_elem, elem, i, j;
randomize();
/* cantidad de elementos */
printf("Cantidad de enteros?: ");
scanf("%d",&n_elem);
while(getchar()!='\n');
/* dimensionar arreglo */
vec = (int*)malloc((n_elem+1)*sizeof(int));
/* ingreso aleatorio (0-99) */
for(i = 0; i < n_elem; i++) vec[i] = rand()%100;
/* buble */
for(i=0; i < n_elem; i++)
for(j=0; j < n_elem; j++)
if (vec[i] < vec[j]) {
vec[i] ^= vec[j];
vec[j] ^= vec[i];
vec[i] ^= vec[j];
}
/* mostrar arreglo ordenado */
printf("\nArreglo ordenado: ");
for(i=0; i < n_elem; i++) printf("%3d",vec[i]);
/* pedir elemento a insertar */
printf("\nNumero a insertar: ");
scanf("%d", &elem);
/* insertar elemento */
i = 0;
while (elem > vec[i] && i < n_elem) i++;
for(j = n_elem+1; j > i; j--) vec[j] = vec[j-1];
vec[i] = elem;
/* mostrar arreglo con elemento insertado */
printf("\nArreglo final: ");
for(i=0; i < n_elem+1; i++) printf("%3d",vec[i]);
while(getchar()!='\n');
getchar();
return 0;
}
Saludos.
Citar/* buble */
for(i=0; i < n_elem; i++)
for(j=0; j < n_elem; j++)
if (vec[i] < vec[j]) {
vec[i] ^= vec[j];
vec[j] ^= vec[i];
vec[i] ^= vec[j];
}
nunca habia visto esta manera de ordenar un arreglo y me la apunto :D
solo una cosa y es que diria que en un arreglo de int no hace falta reservar un espacio al final para un null. y si reservas memoria, asegurate al final de liberarla con free(vec).
un saludo!
Hola xiruko.
En realidad el espacio extra reservado es para el elemento a insertar. Y tenes razón, se me escapó el free... :(
Saludos.
vaya es verdad, me olvide del objetivo del programa y no cai... :laugh:
un saludo!
gracias ecfisa le hice unas modificaciones a mi código ya que pensé que lo único que le faltaba era agregar v=x para integrar el nuevo elemento en el vector sin desordenarlo, pero aunque no me marca errores no hace lo que le pido y no entiendo por qué, leí tu código pero me fue un poco difícil de entender porque todavia no domino el uso de apuntadores
#include <stdio.h>
#include <stdlib.h>
#define MAX 20
/* Leer un vector de longitud n ordenado ascendente y un elemento x del mismo tipo que los
elementos del vector, intercalar x en el vector v de manera que siga ordenado.
*/
int main()
{
int n,i,j,v[MAX],aux,x;
printf("Dame longitud del vector\n");
scanf("%d",&n);
printf("Imprimir vector\n");
for(i=0;i<n;i++)
{
printf("Imprimir elemento %d\n",i);
scanf("%d",&v[i]);
}
printf("Orden ascendente\n");
for(j=0;j<n;j++)
{
for(i=0;i<n;i++)
{
if(v[i+1]>v[i] && i+1!=n)
{
aux=v[i+1];
v[i+1]=v[i];
v[i]=aux;
}
}
}
for(i=0;i<n;i++)
{
printf("%d\n",v[i]);
}
printf("Dame elemento a intercalar");
scanf("%d",&x);
for(i=0;i<=n;i++)
{
if(x > v[i])
{
for(j=n;j>i;j--)
{
v[j]=v[j-1];
}
}
}
v[i]=x;
for(i=0;i<=n;i++)
printf("%d\n",v[i]);
return 0;
}
me di cuenta que tu usas un while para ir recorriendo los elementos y dejar un espacio para el elemento nuevo, pero yo utilice el for para que me vaya recorriendo el vector uno por uno pero aun asi no funciona
gracias
Hola m@o_614.
#include <stdio.h>
#include <stdlib.h>
#define MAX 21
int main()
{
int n, i, j, v[MAX], x, aux;
/* PEDIR CANTIDAD DE ELEMENTOS */
printf("Dame longitud del vector(maximo 20) :");
scanf("%d",&n);
printf("\n");
/* PEDIR LOS ELEMENTOS */
for(i = 0; i < n; i++) {
printf("Elemento %d :",i+1);
scanf("%d",&v[i]);
printf("\n");
}
/* ORDENAR EL ARREGLO */
for(i=0; i < n; i++)
for(j=0; j < n; j++)
if (v[i] < v[j]) {
aux = v[i];
v[i] = v[j];
v[j] = aux;
}
/* MOSTRAR ARREGLO ORDENADO */
printf("Orden ascendente\n");
for(i=0; i<n; i++) printf("%d\n",v[i]);
/* PEDIR ELEMENTO A INSERTAR */
printf("Dame elemento a intercalar :");
scanf("%d",&x);
printf("\n");
/* INSERTAR EL ELEMENTO */
i = 0;
while (x > v[i] && i <= n) i++;
for(j = n+1; j > i; j--) v[j] = v[j-1];
v[i] = x;
/* MOSTRAR ARREGLO CON ELEMENTO INSERTADO EN POSICION */
printf("Resultado\n");
for(i=0; i<=n; i++) printf("%d\n",v[i]);
while(getchar()!='\n');
getchar();
return 0;
}
Saludos.