Ayuda con este pequeño programa en c

Iniciado por Chupakabras, 27 Mayo 2015, 08:02 AM

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

Chupakabras

Hola, disculpen si no me conocen pues recién me uní al foro.
Para no hacer muy largo el mensaje pues resumiré diciendo que estoy estudiando electrónica y estoy cursando programación (aunque en 2 semanas termina el semestre). Sin embargo desde que entramos a arreglos he tenido ciertos problemas para entender y problemas en mis programas, lo de entender lo resolví más o menos estudiando pero mis programas fallan mucho por cosas que de plano no entiendo o no encuentro error. Este es el programa que necesito corregir:



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

int main()
{
int temp;
int sp, p, can, i;
int * datos=NULL;
char cambios;

printf("Intruduce la cantidad de datos que deseas introducir: "), scanf("%i", &can);
datos =(malloc (can * sizeof(int)));
for (i=1; i<=can; i++)
{
printf("Introduce un dato: "), scanf("%i", datos[i-1]);
}

do
{
for(p=0, sp=p+1, cambios='n'; p<=(can-1); p++)
{
temp=datos[p];
datos[p]= datos[sp];
datos[sp]=temp;
cambios='s';
}

} while (cambios=='s');

for(i=1; i<=can; i++)
{
printf("\n%i", datos[i-1]);
}


return 0;
}



El problema es que originalmente me decía que no podía convertir un valor void a int pero era debido a que por error lo guardé como c++ y no como c, al cambiarlo se resolvió pero surgió el problema de que cuando lo corro despues de ingresar el número de dígitos que quiero utilizar e ingreso los dígitos el programa deja de funcionar y no encuentro por que. El programa, en teoría, debería dejar que uno introduzca la cantidad de dígitos que quiera y posteriormente introducir los respectivos dígitos; despues bebería organizarlos en el vector horizontal los dígitos de menor a mayor para que si digo que quiero 3 dígitos e introduzco 3, 7 y 1 deberían terminar como 1, 3 y 7 en el arreglo.
Perdón si mi petición tiene un formato muy simple pero la verdad hace tiempo que no entro a los foros y estoy algo oxidado en darles formato jaja.

Mod: Código corregido con etiquetas GeSHi para hacerlo más legible

crack81

Bueno de entrada te conviene darle una revisada a los metodos de ordenacion para que te des una idea su funcionamiento y entiedas las distintas formas de implementacion como su uso, cuando usar uno y cuanod no.

link metodos ordenacion:http://www.c.conclase.net/orden/

Respecto a tu pregunta he implementado un codigo que utiliza el metodo de ordenacion burbuja que aunque es el mas ineficiente es el mas sencillo de aplicar y entender.


te dejo esta version

#include <stdio.h>

void ordernarPorBurbuja(int *lista,int TAM){
   
   int i,j;
   int temp; 
   
   for (i=1; i<TAM; i++){
      for(j=0; j<TAM - 1; j++){
          if (lista[j] > lista[j+1]){
             temp = lista[j];
             lista[j] = lista[j+1];
             lista[j+1] = temp;
          }
      }
   }

}

int main()
{
   
    int tam,i,valor;
    int *datos;
   
    printf("Introduce la cantidad de valores a introducir: ");
    scanf("%d",&tam);
   
    datos=malloc(tam*sizeof(int));
   
    for(i=0;i<tam;i++){
       printf("Ingrese el valor #%d\n",i+1);
       scanf("%d",&valor);
       datos[i]=valor;                   
    }
   
    ordernarPorBurbuja(datos,tam);
    printf("\nValores ordenados: \n");   
   
    for(i=0;i<tam;i++){
                       
      printf("%d ",datos[i]);
    }
   
   
   
    free(datos);
    getchar();
    getchar();
  return 0;
}

Si tienes preguntas no dudes en comentarlas saludos....
Si C/C++ es el padre de los lenguajes entonces ASM es dios.

Chupakabras

Hola perdón por tardar en contestar, esque estamos casi por terminar el semestre y tengo un monton de proyectos, tareas y esas cosas jaja (sin mencionar que tendré 2 examenes en 2 días seguidos para terminar teniendo otro el lunes por lo que no podré disfrutar mucho este fin de semana jaja), pero bueno, siendo honesto no entiendo gran parte del código que me muestras.
La materia es programación estructurada y no nos han mostrado muchas cosas que tu pusiste (no se si sea normal o el profesor no enseño todo lo que debía), por ejm no se que fue lo que declaraste con void al inicio del programa o la estructura que pusiste despues (tengo cierta idea del funcionamiento pero aun así no entiendo muy bien); deja te pongo el código que el profesor había utilizado como ejm. en clase:


[code]#include <stdio.h> /* para printf() y scanf() */
#include <stdlib.h> /* para malloc */
#include <conio.h> /* para getch() */
#include <ctype.h> /* para toupper() */

int main(){
/* La siguiente linea tiene la función de declarar (m) para uso dinámica */
int * m = NULL; /* apuntador a m (vector) */
char op;
/********************************************************************/
int columnas, c, p, temp;
_Bool movio;

do
{
printf ("Columnas: "); scanf ("%d", &columnas);

/* reserva de memoria */
m = malloc(columnas * sizeof(int)); /* Columnas */

/* trabajo con m[i] */
for (c=1; c<=columnas; c++)
{
printf("C[%i]= ", c);
scanf("%i", &m[c-1]);
}

for (c=1; c<=columnas; c++)
printf("[%3i]", m[c-1]);
puts(": Original\n");

/* ordena datos por el método burbuja */
do
{
movio=0;
p=0;
while(p<(columnas-1))
{
if (m[p]>m[p+1])
{
temp=m[p];
m[p]=m[p+1];
m[p+1]=temp;
movio=1;
}
p++;
}
}while(movio);

for (c=1; c<=columnas; c++)
printf("[%3i]", m[c-1]);
puts(": Ordenado\n");

/* liberación de memoria */
free(m);
m = NULL;

puts("\nReingresar nuevos datos (S/N): "), op=getch();
}while (toupper(op)=='S');

return 0;
}
[/code]
No se si te sirva para darte una idea de más o menos como es la clase jaja, aun así gracias por contestar y saludos.
pd. gracias al mod también por corregir mi mensaje, intentaré publicar de manera similar de ahora en adelante.