Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - Pino06-01-2016

Páginas: [1]
1
Hola, Ogramar.
Gracias por tu tiempo, te dejo el código para que si lo deseas me ayudes con un segmentation fault, si pongo lo mismo dentro de main funciona todo a la perfección pero si lo hago como en este caso desde una función me da el error. -

Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>

struct nodo{
int dato;
struct nodo *siguiente;
};

struct lista{
struct nodo *primero;
struct nodo *ultimo;
};

struct lista *ingresos( struct lista *L );
struct lista *agregar( struct lista *L, int dato );
struct nodo *crear( int dato );
void ordenar(struct lista *L);
void mostrar(struct lista *L);


int main( void ){
struct lista *Lista = NULL;

ingresos( Lista );
ordenar( Lista );
mostrar( Lista );

free(Lista);
return 0;
}

struct lista *ingresos( struct lista *L ){
int i;

for( i=0; i<7; i++ ){
printf( "\n %d", i );
L = agregar( L, i );
}

return L;
}


struct lista *agregar( struct lista *L, int dato ){
if( L != NULL ){
struct nodo *e = crear( dato );
L->ultimo->siguiente = e;
L->ultimo = e;

return L;
}else{
struct nodo *e = crear( dato );
struct lista *l = calloc( sizeof( struct lista ), 1 );
l->primero = e;
l->ultimo = e;

return l;
}
}

struct nodo *crear( int dato ){
struct nodo *e = calloc( sizeof( struct nodo), 1 );
e->dato = dato;
e->siguiente = NULL;

return e;
}

void ordenar(struct lista *L){
struct nodo *pivote = NULL,*actual = NULL;
int tmp;
if(L != NULL){
pivote = L->primero;
while(pivote != L->ultimo){
actual = pivote->siguiente;
while(actual != NULL){
if(pivote->dato > actual->dato){
tmp = pivote->dato;
pivote->dato = actual->dato;
actual->dato = tmp;
}
actual = actual->siguiente;
    }
pivote = pivote->siguiente;
    }

}
    else{
    printf("Error lista no inicializada");
    }
}

void mostrar(struct lista *L){
struct nodo *auxiliar;
int i=0;
auxiliar = L->primero;

    printf("\n\n Mostrando lista ordenada:\n");

while (auxiliar!=NULL) {
printf( "\n %d", auxiliar->dato);
auxiliar = auxiliar->siguiente;
i++;
}
if (i==0) printf( "\nLa lista está vacía!!\n" );
}

saludos.

2
Hola, a todos. Les voy a pedir un poco de colaboración para aprender a ordenar una lista simplemente enlazada, lo voy a implementar utilizando el método de la burbuja pero desconozco cómo hacerlo, vi algunos Ejs. pero no me queda claro si se hace como ordenar un vector o como leí que se debe volcar los datos a un vector, ordenarlos y luego crear una lista nueva con los datos ordenados.

Les dejo el código de lo que llevo hasta el momento. -

Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>

 
struct _agenda{
int dato;
struct _agenda *siguiente;
};
 
struct _agenda *primero, *ultimo;
 
void mostrar_menu();
void agregar_elemento( size_t *cont );
void mostrar_lista( size_t cont);
void ordenar_lista( size_t cont);
 
int main(void){
char opcion, ch;
size_t cont = 0;
primero = (struct _agenda *) NULL;
ultimo = (struct _agenda *) NULL;

do{
mostrar_menu();
opcion = getchar();
while((ch = getchar()) != EOF && ch != '\n');
switch ( opcion ){
case '1': agregar_elemento( &cont );
break;
case '2':  printf("No disponible todavía!\n");
break;
case '3': mostrar_lista( cont );
break;
case '4': ordenar_lista( cont );
break;
case '5': exit( 1 );
default: printf( "Opción no válida\n" );
printf( "\n Pulse una tecla para continuar..." ); getchar();
break;
}
} while (opcion!='5');   
 
return 0;
}
 
 
void mostrar_menu(){
system( "clear" );
printf( "\n\n ===== Menu =====" );
printf( "\n\n 1 - Agregar elemento" );
printf( "\n 2 - Borrar elemento" );
printf( "\n 3 - Mostrar elementos" );
printf( "\n 4 - Ordenar elementos" );
printf( "\n 5 - Salir" );
 
  printf("\n\n Escoge una opcion......: ");
}
 
 
/* Con esta función añadimos un elemento al final de la lista */
void agregar_elemento( size_t *cont ){
struct _agenda *nuevo;
int ch;
 
/* reservamos memoria para el nuevo elemento */
nuevo = (struct _agenda *) malloc (sizeof(struct _agenda));
if( nuevo == NULL){
printf(" \n No hay memoria disponible");
}
printf( "\n ===== Nuevo elemento =====" );
printf( "\n Dato.....:" );
scanf( "%d", &nuevo->dato );
while ((ch = getchar()) != EOF && ch != '\n');
 
/* el campo siguiente va a ser NULL por ser el último elemento*/
nuevo->siguiente = NULL;
 
/* ahora metemos el nuevo elemento en la lista. lo situamos al final de la lista */
/* comprobamos si la lista está vacía. si primero==NULL es que no
         hay ningún elemento en la lista. también vale ultimo==NULL */
if( primero == NULL ){
printf( "\n Primer elemento" );
primero = nuevo;
ultimo  = nuevo;
}else{
/* el que hasta ahora era el último tiene que apuntar al nuevo */
ultimo->siguiente = nuevo;
/* hacemos que el nuevo sea ahora el último */
ultimo = nuevo;
}
*cont += 1;
}
 
 
void mostrar_lista( size_t cont ){
struct _agenda *auxiliar; /* lo usamos para recorrer la lista */
int i=0;
 
auxiliar = primero;
printf( "\n Mostrando la lista completa (total %lu):\n ", cont);
while( auxiliar != NULL ){
printf( "\n Dato....: %d", auxiliar->dato);
auxiliar = auxiliar->siguiente;
i++;
}
if( i==0 ){
printf( "\n La lista esta vacia!!\n" );
}
printf( "\n Pulse una tecla para continuar..." ); getchar();
}

void ordenar_lista( size_t cont){
printf( "\n No desarrollado..." ); getchar();
}


Saludos.
Daniel

3
Hola gente.
Código: [Seleccionar]
fgets( word[i], MAX_COL , stdin );

if((p=strchr(word[i], '\n'))){
*p='\0';
}
else{
while((ch = getchar()) !='\n' && ch!=EOF);
word[i][MAX_COL] = '\0';
}

En este trozo de código está mi gran duda, según lo que tengo leído es que si ingreso menos caracteres que  MAX_COL fgets los guarda desde el buffer de teclado en la variable indicada, en este caso word y también el carácter de nueva línea (\n) que se produce al apretar < Enter >, la primera duda, ¿es estrictamente necesario remplazar el carácter \n por \0? -
En el caso de ingresar más caracteres del establecido por MAX_COL fgets lee  MAX_COL – 1 y en la última casilla de memoria asignada a MAX_COL copia el carácter \n, de ser esto cierto la otra duda es:  ¿la sentencia else no se ejecuta nunca en este caso, o estoy equivocado?

Desde ya muchas gracias por el tiempo que le dediquen al tema,-

Saludos.
Daniel

4
Hola, Ogramar.
Muchas gracias por todo lo que hiciste para que funcione, no te ocupes más de este asunto, tal vez cuando lo olvides, te caiga la ficha, yo voy a seguir intentando, no me cabe que la fórmula que propusiste no funcione. -

Un fuerte abrazo.

5
Hola, Ogramar.
Créeme que ya me canse de practicar y no doy con el error, te dejo el código por si quieres revisarlo y una captura ingresando el número que propusiste.- 



Código: [Seleccionar]
#include <stdio.h>
#include <float.h>
#include <stdlib.h>

int main( void ){
double numero , decimal;
int entero, contador = 0, ok, ch;

do{
printf("\n Ingrese un numero con decimales...: ");
ok = scanf( "%lf", &numero ) == 1 && numero > 0.00 && numero <= DBL_MAX;
while ((ch = getchar()) != EOF && ch != '\n');
}while(!ok);
 
entero = (int)numero;
decimal = numero - entero;

while(decimal != 0 ){
decimal = decimal * 10;
decimal = decimal - (int)decimal;
printf("\n Decimal...: %g", decimal);
// getchar();
contador ++;
}
 
printf("\n Total de digitos despues de la coma..:%d\n", contador);
 
return 0;
}

Saludos.

6
Hola.
Gracias por ocuparte, el caso es un tanto sencillo, te pongo un ejemplo, se ingresa por teclado 123.456 para extraer la parte entera y la parte decimal utilizo estas 2 lineas de código:

Código: [Seleccionar]
entero = (int)numero;
decimal = numero - entero;

El resultado de la parte fraccionaria (que es la que no puedo resolver) es 0.456, para llegar a obtener tan solo 456 o sea sin parte fraccionaria como si fuera un entero debo saber de antemano por cuanto tengo que multiplicarlo en este caso x 1.000.-

12.3 la parte fraccionaria multiplicada x 10 es igual a 3   
12.34 la parte fraccionaria multiplicada x 100 es igual a 34   
12.345 la parte fraccionaria multiplicada x 1000 es igual a 345

Te voy a ser muy franco, ya estoy por tirar la toalla, hace una semana que estoy con el tema y parece que no tiene manera de lograrse.-

Ojalá Dios te ilumine y puedas ayudarme.-

Nota: recordar que no puedo utilizar el tipo char.- 

Saludos.

7
Hola. El programa que muestro a continuación lo que hace es separar los dígitos que se encuentran a la izquierda de la coma y los que se encuentran a la derecha, o sea, la parte entera y la parte fraccionaria de una variable double, hasta hay todo bien, el error lo tengo cuando el bucle for no coincide con la cantidad de dígitos fraccionarios.-
Alguien me puede decir si es posible establecer cuantos dígitos ha ingresado el operador a la derecha de la coma, he intentado por todos los medios a mi alcance (lectura y búsqueda en la web) y no pude lograrlo.-

Código: [Seleccionar]
#include <stdio.h>
#include <float.h>

int main( void ){
double numero , decimal;
int entero, x = 1, ok, ch;

do{
printf("\n Ingrese un numero con decimales...: ");
ok = scanf( "%lf", &numero ) == 1 && numero > 0.00 && numero <= DBL_MAX;
while ((ch = getchar()) != EOF && ch != '\n');
}while(!ok);
 
entero = (int)numero;
decimal = numero - entero;

while(x <= 4 ){
decimal  *=10;
x++;
}
 
printf("\n La parte fraccionaria..:%g\n", decimal);
 
return 0;
}

Gracias y saludos.

Páginas: [1]

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".