Menú

Mostrar Mensajes

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

Mostrar Mensajes Menú

Temas - NOB2014

#1
Hola, buen día.
Les comento lo que me pasa, mi único sistema operativo es Ubuntu 17.10 y tengo la necesidad de instalar windows 7 y como dice el enunciado no puedo realizar una partición para instalar el SO, instale un programa(no recuerdo el nombre) que todos recomiendan en internet(no foros) pero no lo puedo arrancar ni desde el lanzador ni desde la consola, le aclaro que es la primera vez que instalo windows, con esto dejo aclarado que soy un novato en el tema.-

Saludos.
Daniel
#2
Hola, muy buen día.-
Los molesto por 2 cosas.
La primera es para que me digan como puedo mostrar las traducciones alineadas:

Incorrecto
CitarHome   Hogar
Almost   Casi
Also   También

CitarCorrecto
Home       Hogar
Almost     Casi
Also         También

Y la segunda para que alguien con mucho pero mucho tiempo me de algún consejo
para mejorar el código(recién me estoy iniciando).-

Las funciones a tener en cuenta son guardar y listado

Código (python) [Seleccionar]
# -*- coding: utf-8 -*-
import os

# Traductor Inglés/Español

def menu():
borrar_pantalla()
listado()
while True:
registros=cantidad_registros()
print("\n ========== Traductor Inglés/Español ==========")
print("\n Cantidad de traducciones guardadas...:{} ".format(registros))
print("\n\n --------------- Menú principal ---------------")
print(" \n\t 1) Ingresar. \n\t 2) Consultar(visualizar/borrar)."
"\n\t 3) Finalizar.")

opcion = input("\n\t Elija opción..............: ")
if opcion < '1' or opcion > '3':
print("\n Por favor, elija una opción válida ")
input("\n Pulse [Enter] para continuar...")
borrar_pantalla()
elif len(opcion) > 1:
print("\n Por favor, elija una opción válida ")
input("\n Pulse [Enter] para continuar...")
borrar_pantalla()
else:
if opcion == '1':
ingreso()
elif  opcion == '2':
registros=cantidad_registros()
if registros > 0:
consulta()
else:
print("\n No hay traducciones guardadas para buscar")
input("\n Pulse [Enter] para continuar...")
borrar_pantalla()
if opcion == '3':
break

def listado():
print("\n ========== Listado de traducciones guardadas. ==========")
with open('traductor.txt', 'r') as tra:
for linea in tra:
print(" ", linea)

def ingreso():
borrar_pantalla()
while True:
ingles = input("\n Ingrese palabra en Inglés.......: ")
while len(ingles) == 0:
ingles = input("\n Ingrese palabra en Inglés.......: ")

espaniol = input("\n Ingrese traducción al Español...: ")
while len(espaniol) == 0:
espaniol = input("\n Ingrese traducción al Español...: ")
arch = input('\n Ingrese "Si" para guardar traducción en disco'
'\n otra para descartar.............:')
if arch == 'Si':
trad = ingles + "   " + espaniol +"\n"
guardar(trad)
else:
print("\n La traducción no fue guardada...")

seg_salir = input('\n Ingrese "Si" para otra traducción\n'
  ' Otra para ir al menú..........:')
if seg_salir == 'Si':
borrar_pantalla()
else:
menu()
break

def guardar(trad):
f=open("traductor.txt", "a")
f.write(trad)
f.close()


def consulta():
borrar_pantalla()
encontrado=""
busqueda = input("\n Ingrese consulta (en inglés o español...:) ")
with open('traductor.txt', 'r') as tra:
for linea in tra:
if busqueda in linea:
encontrado=linea

if len(encontrado) > 0:
print("\n Resultado...: {0}".format(encontrado))
print("\n ¿Desea borrar la traducción en pantalla?\n ")
opcion = input(" 'Si' para borrar / otra para descartar...: ")
if opcion == 'Si':
borrar_traduccion(encontrado)
else:
print("\n La traducción no existe...")
input("\n Pulse [Enter] para continuar...")

def cantidad_registros():
f = open("traductor.txt","r")
f.readline()
f.seek(0)
cant_registros = len(f.readlines())
f.close()

return cant_registros


def borrar_traduccion(encontrado):
f = open("traductor.txt","r")
lineas = f.readlines()
f.close()

f = open("traductor.txt","w")
for linea in lineas:
if linea!=encontrado:
f.write(linea)

f.close()



def borrar_pantalla():
if os.name == "posix":
os.system ("clear")
elif os.name == ("ce", "nt", "dos"):
os.system ("cls")

def main():
menu()

main()

   
Saludos y gracias.
Daniel

#3
Hola gente, buen día. Estoy estudiando archivo y me encuentro con 2 dudas(por el momento):
La primera es que no logro que me copie el salto de línea, yo creí que al finalizar la frase con [Enter] bastaba pero parece que en el archivo no se ve reflejado.-
Y lo segundo es si estoy rumbeado con las líneas para buscar una palabra en el archivo.-

Código (python) [Seleccionar]
a=0
f=open("archivo.txt", "a")
for a in range(5):
b = input("\n Ingrese frase...:")
f.write(b)
a+=1
f.close()


Código (python) [Seleccionar]
palabra = 'Arequito'
ocurrencias = []
with open('archivo.txt') as lineas:
    for linea in lineas:
        if palabra in linea:
            ocurrencias.append(linea)

print ocurrencias


Saludos.
Daniel
#4
Hola gente, ¿como están?
El programa funciona, pero hay algo que salio de "casualidad" y lo que quiero es encontrarle la lógica.-
Lo que no entiendo es porque  funciona el bucle while.-

Código (python) [Seleccionar]
while((re.findall(expr, cadena))):

Código (python) [Seleccionar]
# -*- coding: utf-8 -*-
import os
import re

def input_abc():
expr = r'[0-9]'
cadena = input('\n Ingrece una cadena (no se permiten números)...: ')
while((re.findall(expr, cadena))):
borrar()
cadena = input('\n Ingrece una cadena (no se permiten números)...: ')

return cadena

def borrar():
print('\n\tError. No se permiten números...')
input("\n Pulse una tecla para continuar...")
if os.name == "posix":
os.system ("clear")
elif os.name == ("ce", "nt", "dos"):
os.system ("cls")

def main():
print("\n Cadena introducida: ", input_abc())

main()


Saludos.
Daniel
#5
Scripting / Validar ingreso de datos con Python
16 Octubre 2017, 19:14 PM
Hola amigos, ¿como están?.
Tengo una duda con el código que dejo a continuación, con estos videos estoy aprendiendo a programar en python:https://www.youtube.com/watch?v=2MaAs7XU2T0 y he llegado a las excepciones, la consulta es como resulta más conveniente validar los datos ingresado por teclado, utilizando try/except o con if, para validar un dato float no se debe permitir el ingreso de otra cosa que no sean números del 0 al 9 y que las variables op1 y op2 no pueden valer cero, creo que es todo -
Otra cosita, me podrían dar alguna idea para mejorar el código. -

Código (python) [Seleccionar]
import os

def sum(num1, num2):
return num1+num2

def res(num1, num2):
return num1-num2

def div(num1, num2):
return num1/num2

def mul(num1, num2):
return num1*num2

while True:
op1=(float(input("\n Introduce el primer número...: ")))
op2=(float(input("\n Introduce el segundo numero..: ")))

print("\n ====================================")
print("\n 1 - Suma\n 2 - Resta\n 3 - División\n 4 - Multiplicación\n ")
operacion=(int(input("\n Introduce opción..: ")))

if operacion == 1:
print("\n " + str(op1) + " + " + str(op2) + " = ",  sum(op1,op2))
if operacion == 2:
print("\n " + str(op1) + " - " + str(op2) + " = ",  res(op1,op2))
if operacion == 3:
print("\n " + str(op1) + " / " + str(op2) + " = ",  div(op1,op2))
if operacion == 4:
print("\n " + str(op1) + " x " + str(op2) + " = ",  mul(op1,op2))

print("\n ====================================")
print("\n 1 - Otra operación\n 2 - Finalizar\n ")
salSeg=(int(input("\n Introduce opción..: ")))

if salSeg == 1:
os.system('clear')
else:
break



Desde ya muchas gracias.-
Un abrazo. Daniel
#6
Hola a todos, que tengan un muy buen día. -
Hace 3 días que estoy leyendo el libro "Aprenda a pensar como un programador" y quería
hacer el siguiente programita a partir del número 1234 mostrar por pantalla por separado
los 4 números, pero no me sale, es obvio que debería utilizar un bucle pero todavía no se
como es la sintaxis. -
Les dejo lo que llevo hecho para ver si me pueden orientar.-

Código (python) [Seleccionar]
a = 1234
b = 10
c = a % b
print(c)


Lo que ocurre es que cuando divido 1234/10 me sale con decimales y necesito que el resultado
sea 1234-123-12-1
Saludos y un abrazo.-
Daniel
#7
Hola, muy buen día. -
El programa que dejo a continuación logra perfectamente lo que necesito, pero quiero meter todo esto en una función para obtener el día de la semana, nada más que eso y me parecen muchas líneas para lograr tan solo una, alguien tiene algo con menos líneas y que haga lo mismo? .-

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

char *dias [] = {" ", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado", "Domingo"} ;

int main ( int argc, char *argv[ ] ){
struct tm fecha;
int anyo, mes, dia;

printf (" \n año.....: ");
scanf ("%d", &anyo) ;

printf( " Mes......: ");
scanf ("%d", &mes);

printf ( " Dia......: ");
scanf ("%d", &dia) ;

fecha.tm_year = anyo - 1900;
fecha.tm_mon = mes - 1;
fecha.tm_mday = dia;
fecha.tm_hour = 0;
fecha.tm_min = 0;
fecha.tm_sec = 1;
fecha.tm_isdst = -1;

if (mktime (&fecha) == -1){
puts ( " Error en la fecha. " ) ;
exit(-1);
}

if (fecha.tm_wday == 0)
fecha.tm_wday = 7;

printf("\n El %d/%d/%d es %s" , dia, mes, anyo, dias[fecha.tm_wday]);

return EXIT_SUCCESS;
}


Desde ya muchas gracias.
Saludos.
#8
Hola, gente. -
Me encuentro haciendo un recordatorio y estoy en la parte de la fecha, el caso es que para validar que la fecha sea correcta tengo 3 variables enteras con el día el mes y el año pero necesito pasar todo a una variable char con las barritas y todo, estuve practicando con fprintf pero no lo logro, si alguien tiene un Ej. se lo agradecería. -

Saludos.
#9
Hola, que tengan un muy buen día.
Lo que no puedo encontrar es información de porque ocurren los errores en archivos, quisiera informar al operario que pasó si por Ej. no se pudo abrir un archivo, o si no se pudo crear el archivo .bak, desconozco si esto es privativo del sistema operativo o si tiene que ver con el lenguaje. -
También me interesaría completar el mensaje con que hacer para que esto no ocurra nuevamente. -
Deje el programa(sin terminar) por si les ayuda en algo para entender mi pedido. -

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

#define MAX 80

void ingresarFrase( char frase[] );
void copiar( char frase[] );
void mostrar( void );
void errorEscritura( void );
void copiaDeSeguridad( const char *GtTxt, const char *GtBak );
void mensaje( int par );
 
int main( void ){
char frase[MAX];

ingresarFrase( frase );
copiar( frase );
mostrar(  );
copiaDeSeguridad( "archGuiaTel.txt","archGuiaTel.bak" );


return EXIT_SUCCESS;
}
 
void ingresarFrase( char frase[] ){
int ok=0;

do{
printf( "\n Ingrese frase.....:" );
fgets( frase, MAX, stdin );
ok = strlen( frase );
}while( ok <= 1 );
}
       
void copiar( char frase[] ){
FILE *ptrGtTxt;
int par;

if( !(ptrGtTxt = fopen( "archGuiaTel.txt", "a+" ))){
par = 1;
mensaje( par );
exit(1);
    }

fprintf( ptrGtTxt, "%s", frase );

if( fflush( ptrGtTxt ) != 0){
par = 2;
mensaje( par );
errorEscritura( );
exit(1);
}

if( ( fclose( ptrGtTxt ) ) ){
par = 3;
mensaje( par );
exit(1);
}
}

void mostrar( void ){
FILE *ptrGtTxt;
char texto[100];
int par;

if( !(ptrGtTxt = fopen( "archGuiaTel.txt", "r" ))){
par = 4;
mensaje( par );
exit(1);
    }

printf( "\n ========== Contenido del archivo ==========\n" );
fgets( texto, 100, ptrGtTxt);
while( feof(ptrGtTxt) == 0 ){
printf( "%s",texto );
fgets(texto, 100, ptrGtTxt);
}

if( ( fclose( ptrGtTxt ) ) ){
par = 5;
mensaje( par );
exit(1);
}
}

void errorEscritura( void ){
int par;

if(remove( "archGuiaTel.txt" ) !=0 ){
par = 6;
mensaje( par );
exit(1);
}

if( rename( "archGuiaTel.bak","archGuiaTel.txt") !=0 ){
par = 7;
mensaje( par );
exit(1);
}
}

void copiaDeSeguridad( const char *GtTxt, const char *GtBak ){
FILE *ptrGtTxt, *ptrGtBak; 
char c, x;
int par;

if( !( ptrGtTxt = fopen( GtTxt, "r" ))){
par = 8;
mensaje( par );
exit(1);                               
}
if( !( ptrGtBak = fopen( GtBak, "w" ))){
par = 9;
mensaje( par );
exit(1);                               
}
     
c = fgetc( ptrGtTxt );
while ( c != EOF ){
x = fputc( c, ptrGtBak );
if (x != c){
par = 10;
mensaje( par );
exit(1);                               
}
c = fgetc( ptrGtTxt );
}
     
if( ( fclose( ptrGtTxt ) ) ){
par = 11;
mensaje( par );
exit(1);                               
}
if( ( fclose( ptrGtBak ) ) ){
par = 12;
mensaje( par );
exit(1);                               
}
}

void mensaje( int par ){
int ch, a;

if( par == 1 ){
printf( "\n No se pudo ABRIR el archivo, la frase no se pudo copiar" );
printf( "\n El programa se cerrara sin cambios..." );
}
if( par == 2 ){
printf( "\n No se pudo ESCRIBIR en el archivo..." );
}
if( par == 3 ){
printf( "\n ===> No se pudo CERRAR el archivo..." );
}
if( par == 4 ){
printf( "\n No se pudo ABRIR el archivo..." );
}
if( par == 5 ){
printf( "\n No se pudo CERRAR el archivo..." );
}
if( par == 6 ){
printf( "\n No se pudo BORRAR el archivo..." );
}
if( par == 7 ){
printf( "\n No se pudo RENOMBRAR el archivo..." );
}
if( par == 8 ){
printf( "\n No se pudo ABRIR el archivo(.txt)..." );
}
if( par == 9 ){
printf( "\n No se pudo ABRIR el archivo(.bak)..." );
}
if( par == 10 ){
printf( "\n No se pudo EFECTUAR la copia de seguridad..." );
}
if( par == 11 ){
printf( "\n No se pudo CERRAR el archivo(.txt)..." );
}
if( par == 12 ){
printf( "\n No se pudo CERRAR el archivo(.bak)..." );
}


printf( "\n Pulse una tecla para continuar..."); a = getchar();
    if( a != '\n') while ((ch = getchar()) != EOF && ch != '\n');
}


Saludos.
#10
Hola, gente ¿cómo están?
Lo que me trae en este caso no es para pedir ayuda porque el programa no funciona, lo que quisiera es que me digan que debería cambiar, que les parece, ¿está bien encarado?, estoy consiente que esto se lo debería preguntar a un profe o a un amigo, pero como ya algunos conocen por mi edad (65) no tengo ni una cosa ni la otra,-
Es todo, espero que alguien con mucho tiempo lo revice, no tengo ningún apuro. -   

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

#define MAX 80

void copiaDeSeguridad( FILE *ptrGuiaTel, FILE *ptrGtTemp ); //GT0001
void ingresarFrase( char frase[] ); //GT0002
void copiar( FILE *ptrGuiaTel, FILE *ptrGtTemp, char frase[] ); //GT0003
void errorEscritura( FILE *ptrGuiaTel, FILE *ptrGtTemp ); //GT0004
void mensaje( void );


int main( int argc,char **argv ){
FILE *ptrGuiaTel = NULL, *ptrGtTemp = NULL;
char frase[MAX];

copiaDeSeguridad( ptrGuiaTel, ptrGtTemp ); //GT0001
ingresarFrase( frase ); //GT0002
copiar( ptrGuiaTel, ptrGtTemp, frase ); //GT0003

return EXIT_SUCCESS;
}


void copiaDeSeguridad( FILE *ptrGuiaTel, FILE *ptrGtTemp ){ //GT0001
char c, x;

if( !( ptrGuiaTel = fopen( "archGuiaTel.txt", "r" ))){
mensaje();
exit(1);
}
if( !( ptrGtTemp = fopen( "archGtTemp.txt", "w" ))){
mensaje();
exit(1);
}

c = fgetc( ptrGuiaTel );
while ( c != EOF ){
x = fputc( c, ptrGtTemp );
if (x != c){
mensaje();
exit(1);
}
c = fgetc( ptrGuiaTel );
}

if( ( fclose( ptrGuiaTel ) ) ){
mensaje();
exit(1);
}
if( ( fclose( ptrGtTemp ) ) ){
mensaje();
exit(1);
}
}

void ingresarFrase( char frase[] ){ //GT0002
int ok=0;

do{
printf( "\n Ingrese frase.....:" );
fgets( frase, MAX, stdin );
ok = strlen( frase );
}while( ok <= 1 );
}

void copiar( FILE *ptrGuiaTel, FILE *ptrGtTemp, char frase[] ){ //GT0003

if( !(ptrGuiaTel = fopen( "archGuiaTel.txt", "a" ))){
mensaje();
exit(1);
}

fprintf( ptrGuiaTel, "%s", frase );

if( fflush( ptrGuiaTel ) != 0){
mensaje();
fclose( ptrGuiaTel );
errorEscritura( ptrGuiaTel, ptrGtTemp ); //GT0004
exit(1);
}

if( ( fclose( ptrGuiaTel ) ) ){
mensaje();
exit(1);
}
}

void errorEscritura( FILE *ptrGuiaTel, FILE *ptrGtTemp ){ //GT0004

if( rename("archGtTemp.txt","archGuiaTel.txt") !=0 ){
mensaje();
exit(1);
}

if(remove( "archGuiaTel.txt") !=0 ){
mensaje();
exit(1);
}
}

void mensaje( void ){
int ch, a;

printf( "\n Ha ocurrido un error y el programa finaliza sin cambios en el archivo." );
printf( "\n Pulse una tecla para continuar..."); a = getchar();
if( a != '\n') while ((ch = getchar()) != EOF && ch != '\n');
}

/*
GT0001 - Funcion copiaDeSeguridad
Efectuo una copia del archivo original por si fallara la escritura en el mismo, si esto
ocurriera renombro la copia con el mismo nombre que el archivo original y a este lo borro,
con esto me aseguro que el archivo en disco no quede corrupto. -
Si fallara la apertura de los archivos archGuiaTel.txt o archGtTemp.txt imprimo un mensaje
y cierro el programa (mensaje y exit(1)), lo mismo ocurrira si falla la escritura en el archivo temporal (if (x != c){).-
Si la apertura de los 2 archivos es correcta como asi la escritura, solo queda constatar si
el cierre de los mismos ocurre sin errores, de lo contrario se procedera de la misma manera que en la apertura de los mismos (mensaje y exit (1). -
Nota: En esta funcion se abre y se cierra el archivo "archGtTemp.txt".
//GT0002 - Funcion ingresarFrase   
El do-while es para que no se pueda salir de la funcion si no se ha ingresado por lo menos
un dígito.-
//GT0003 - Funcion copiar
Con fprintf( ptrGuiaTel, "%s", frase ); copio la frase en el buffer intermedio y con fflush
copio la frase desde el buffer al disco rigido(archGuiaTel.txt).-
Verifico si la apertura y cierre del archivo ocurre sin errores.-
En el caso de que fallara fflush llamo a la (//GT0004) funcion errorEscritura para renombrar el archivo archGtTemp.txt por archGuiaTel.txt para luego borrar el
                archivo original que seguramente si no se pudo escribir es porque está corrupto(al final con remove lo borro). -
*/


Saludos.
#11
Hola, gente, que tengan un muy buen día. -
La duda es que se debe hacer cuando la función fclose intenta cerrar un archivo y no lo logra, ¿hay alguna manera de informar el error con detalle?, ¿se debe intentar una segunda vez?, ¿que puedo hacer como programador para ayudar a solucionar el problema?. -

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

int main(int argc,char **argv){
char frase[] = "arequito, centro soguero del pais";
FILE *ptrFrase = NULL;

if(!(ptrFrase = fopen("frase.txt", "w"))){
printf( "\n Error al abrir %s Para escribir. Finaliza el programa.", frase );
exit(1);
}

fprintf(ptrFrase, "%s", frase);

if( fclose( ptrFrase )!=0){
printf( "\n No se ha podido cerrar el fichero %s.", frase );
}

return EXIT_SUCCESS;
}
//https://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Manejo_de_archivos#fprintf

Es todo por el momento, espero que se entienda cuál es mi desconocimiento. -
Saludos.
#12
Hola, gente ¿cómo están?
Tengo una tablet con Windows 10 y todo bien con el audio hasta que efectué una actualización del sistema operativo y desde ese momento estoy sin sonido, estuve haciendo muchas cosas de las que encontré en internet y nada. -
Quisiera saber si alguien tubo el mismo problema y como lo soluciono. -

Daniel
#13
Hola, buen día. -
Necesito una ayudita, encontré este código, pero no logro interpretarlo del todo, el propósito es que en la función get_String en la primera llamada aparezca "el nombre" y en la segunda "la dirección" en TiposString[NomDir->tipo], el caso es que por más que leo los errores no puedo hacer que compile. -
Ya logre lo mismo pasando un parametro a la función, pero me interesaría poder hacerlo de esta manera. -

#include <stdio.h>

typedef struct {
char texto[30];
int tipo;
} texto_t;
     
typedef struct{
texto_t nombre;
texto_t direccion;
}alumno;

const char * TiposString[]={"el nombre","la direccion"};

void get_String( texto_t * NomDir );

int main( void ){
alumno *ptrAlumno;

get_String( ptrAlumno->nombre );
get_String( ptrAlumno->direccion );

return 0;
}

void get_String( texto_t * NomDir ){
printf("\n Ingresa %s del alumno ......:", TiposString[NomDir->tipo] );
}

/*
Para acceder/guardar al texto es:

NomDir->texto


Nos estamos leyendo. -
#14
Hola, saludos para todos.
El código que dejo a continuación es para validar que al ingresar el nombre y apellido de un alumno sea correcto.
Por el momento lo que verifico es:
Que tmp no quede vacío, si se pulsa <Enter> sin ingresar nada o si se se pulsa <Enter> después de pulsar <Espacio> una o varias veces. -
No debe haber espacios ni al principio ni al final de la frase ingresada. -
CitarSi ingreso "  Roberto"  debería devolver "Roberto"
Si ingreso "  Roberto  "  debería devolver "Roberto"
Si ingreso "Roberto  "  debería devolver "Roberto"
El problema lo tengo con poner el final de cadena '\0' después del último carácter, si no hay
espacios en blanco fgets lo deja perfecto pero que pasa si el ingreso es:
[0] R
[1] o
[2] b
[3] e
[4] r
[5] t
[6] o
[7]
[8]
[9] '\0'
Concretamente como harían para pasar el elemento [9] al [7]

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

void get_String( char *tmp );
void ajustes( char *tmp );
void mensajeError();
     
int main( void ){
char tmp[30];      

get_String( tmp );

return EXIT_SUCCESS;
}
     
void get_String( char *tmp ){
int ok, i=0, espacios=0, espIzquierda=0;

do{
ok=1;
printf("\n Ingresa el nombre completo del alumno ......:" );
fgets( tmp, 30, stdin );
ajustes( tmp );
while( tmp[i] != '\0' ){
if( tmp[i] == 32 ){
espacios++;
}else{
if( tmp[0] == 32 && espIzquierda == 0 ){
espIzquierda = i;
}
}
i++;
}
if( i == espacios ){
ok=0; espacios=0; i=0;
mensajeError();
}
}while( !ok );
if( espIzquierda > 0 ){
i=0;
while( tmp[i] != '\0' ){
tmp[i] = tmp[i+espIzquierda];
i++;
}
}
}

void ajustes( char *tmp ){
        char *p = NULL;
        int ch;

        if(( p=strchr( tmp , '\n'))){
                *p='\0';
        }else{
                while((ch = getchar()) !='\n' && ch!=EOF);
        }
}

void mensajeError(){
printf( "\n El dato es obligatorio" );
printf( "\n\t Pulsa <Enter> para intentarlo nuevamente..." ); getchar();
}


Por favor, no hacer caso a las librerías incluidas que es por tantas practicas. -

Saludos.
#15
Hola, ¿cómo están?
Una consulta rapidita, alguien me puede decir que estoy haciendo mal, el puntero que devuelve fgets nunca es nulo, ¿por qué? .-

do{
ok=1;
printf("\n Ingresa el nombre del alumno [%d]......:", max+1);
if( fgets( (b+max)->nombre, 30, stdin ) == NULL ){
ok=0;
printf( "\n El dato es obligatorio..." );
printf( "\n Pulsa <Enter> para intentarlo nuevamente..." ); getchar();
}
}while(!ok);
ajustes( (b+max)->nombre );


Saludos.
#16
Hola, que tengan un muy buen día.
Tengo una duda y espero en primer lugar que se entienda lo que no logro hacer y luego que pueda alguien darme la solución. -

Estas líneas de código las quiero pasar a una función:
if((p=strchr((b+max)->nombre, '\n'))){
*p='\0';
}else{
while((ch = getchar()) !='\n' && ch!=EOF);
}
................................
if((p=strchr((b+max)->direccion, '\n'))){
*p='\0';
}else{
while((ch = getchar()) !='\n' && ch!=EOF);
}


En primer lugar, pasar un solo campo y no el total de la estructura.
luego que los cambios efectuados en la función llamada se vean reflejado en la función llamadora(main). -

El código completo.

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

typedef struct{
char nombre[30];
char direccion[30];
int edad;
}alumno;

int main( void ){
alumno *b=NULL;
int max=1, i, ch=0, seguir=0;
char *p = NULL;

do{
b = ( alumno * )realloc( b, (max)*sizeof(alumno));
if( b==NULL ){
printf("\n No se pudo asignar la memoria!");
exit(EXIT_FAILURE);
}
printf("\n Ingresa el nombre del alumno [%d]......:", max);
fgets( (b+max)->nombre, 30, stdin );

if((p=strchr((b+max)->nombre, '\n'))){
*p='\0';
}else{
while((ch = getchar()) !='\n' && ch!=EOF);
}

printf("\n Ingresa la direccion del alumno [%d]...:", max);
fgets( (b+max)->direccion, 30, stdin );

if((p=strchr((b+max)->direccion, '\n'))){
*p='\0';
}else{
while((ch = getchar()) !='\n' && ch!=EOF);
}

printf("\n Ingresa la edad del alumno [%d]........:", max);
scanf( "%d", &(b+max)->edad );

printf( "\n distinto a \"0\" introduce otro alumno.: " );
scanf( "%d", &seguir );
max++;
}while( seguir != 0 );

for ( i=0; i<max; i++ ){
printf( "%s\t%s\t%d\n",(*(b+i)).nombre, (*(b+i)).direccion, (*(b+i)).edad );
}

free( b );

return 0;
}


Saludos y gracias. -
#17
Hoa, gente ¿cómo están?
Bueno no tengo mucho para agregar, por más que busco en internet no puedo encontrar un Ej. concreto de como liberar la memoria en una estructura dinámica. -

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

typedef struct{
char nombre[30];
char direccion[30];
int edad;
}alumno;

int main( void ){
alumno *b=NULL;
int max,i;
unsigned int ch=0;

printf("\n Ingresa la cantidad de alumnos.....:");
scanf("%d", &max);
b = ( alumno * )malloc( sizeof(alumno)*max );
for( i=0; i<max; i++){
printf("\n Ingresa el nombre del alumnos [%d].....:", i+1);
scanf( "%s", (b+i)->nombre );
while((ch = getchar()) !='\n' && ch!=EOF);
printf("\n Ingresa la direccion del alumno [%d]...:", i+1);
scanf( "%s", (b+i)->direccion );
while((ch = getchar()) !='\n' && ch!=EOF);
printf("\n Ingresa la edad del alumno [%d]........:", i+1);
scanf( "%d", &(b+i)->edad );
printf( "\n ================================================\n" );
}

for (i=0;i<max;i++){
printf("%s\t%s\t%d\n",(*(b+i)).nombre,(*(b+i)).direccion,(*(b+i)).edad);
}

return 0;
}


Si alguien me pondría un Ej. relacionado con el código, Danielito muy agradecido -
Saludos.
#18
Hola, muy buen día para todos.
Hoy no les consulto por un error sino por algo que por más que busco en la web no encuentro la respuesta, ¿es posible agrupar desde la línea 10 a la 15 con un operador ternario y de no ser así me podrían dar alguna idea de como hacerlo con un #define? -

#include <stdio.h>

int d( char *a, char *b);

int main( void ){
char a[] = "rosita", b[] = "Rosita";
int res;

res = d( a, b );
if( res == 0 )
printf( "\n Las frases %s y %s son IGUALES\n\n", a, b );
else if( res < 0 )
printf( "\n %s es MAYOR que %s\n\n", a, b );
else
printf( "\n %s es MENOR que %s\n\n", a, b );

return 0;
}


// Lo que regresa la función: >0 si a<b ==> 0 si a==b ==> <0 si a>b
int d( char *a, char *b ){

for( ; *a == *b; a++, b++ )
if( *a == '\0' )
return 0;

return *a - *b;
}



Desde ya muchas gracias por el tiempo que le dediquen. -
Saludos.
#19
Hola, gente ¿cómo están? ya los extrañaba. -
Estoy repasando punteros y me encuentro en el libro de los autores de C (creo que lo son) con esta función(d) que no logro hacer que de los resultados esperados, me podrían decir que estoy haciendo mal. -

#include <stdio.h>

void d( char *c, char *a);

int main( void ){
char a[] = "rosita", *b = "rosita", c[7];

printf("\n %s", a );
printf("\n %s \n\n ", b );

a[0] = 'R';
b = a;

printf("\n %s", a );
printf("\n %s \n\n ", b );

d( c, a );

return 0;
}



void d( char *c, char *a ){
while( (*c++ = *a++) )
;

printf("\n %s\n", c );
}

Saludos.
#20
Hola, ¿cómo están?
Estoy haciendo algunos repasos y me encontré con este dilema y quería consultarlos, lo que desearía hacer es declarar numeroCadena luego de conocer cuantos dígitos tiene numeroEntero, por lo que tengo leído esto no es permitido en C, pero como aquí hay genios en programación, me atrevo a consultarlos. -

#include <stdio.h>
int cantidadDigitos;

int main( void ){
int  numeroEntero = 41520;
char numeroCadena[6];

cantidadDigitos = sprintf(numeroCadena, "%d", numeroEntero);

printf("\n %s tiene %d digitos \n", numeroCadena, cantidadDigitos );
return 0;
}

Saludos y desde ya muchas gracias. -

#21
Hola, ¿cómo están?
Este programa de Ej. lo saque de este hilo http://foro.elhacker.net/programacion_cc/de_decimal_a_binario_sumando_solo_los_bits_encendidos_c-t430055.0.html(soy el mismo usuario) y ahora repasando lo aprendido me doy cuenta de que la variable bit es una mascara para 29 posiciones y no 32 como seria lo correcto (con unsigned), alguien me podría decir cuál es el error. -

#include <stdio.h>
#include <limits.h>

int main( void ){
unsigned int numero = 42949, i=0;
unsigned int bit = 1U << sizeof(unsigned) * (CHAR_BIT - 1) ;

while ( bit ){
    putchar(numero & bit ? '1' : '0');
    bit >>= 1;
    if( i%4 == 0 ) putchar(' ');
    i++;
}
puts("");

return 0;
}


Citardaniel@daniel-H81M-S1:~/Escritorio/Lanzadores/Proyecto actual$ ./repaso
0 0000 0000 0000 1010 0111 1100 0101
daniel@daniel-H81M-S1:~/Escritorio/Lanzadores/Proyecto actual$

Saludos y muchas gracias desde ya. -
#22
Hola, ¿ cómo están ?
Bueno lo dicho, alguien me puede decir si esto es factible y de serlo, por favor, podrían dar alguna referencia. -
Saludos.
#23
Hola, muy buen día, ¿cómo están? -
Les comento, termine de estudias con el manual de COMO PROGRAMAR C C++ Y JAVA DEITEL&DEITEL-4° Edición-Español y para refrescar conceptos estoy leyendo El lenguaje de programación C - Kernighan, Ritchie, y piden que haga el siguiente programa. -

CitarEjercicio 1-24. Escriba un programa para revisar los errores de sintaxis rudimen­
tarios de un programa en C, como paréntesis, llaves y corchetes no alineados. No
olvide las comillas ni los apóstrofos, las secuencias de escape y los comentarios.
(Este programa es difícil si se hace completamente general.)

La primera duda que tengo es ¿pondrían el código en una variable char o en un archivo?
Desde ya muchas gracias, saludos. -
#24
Hola a todos.
Alguien me podría decir como solucionar el siguiente error:
Citarrepaso.c: In function 'main':
repaso.c:44:3: warning: format '%s' expects argument of type 'char *', but argument 2 has type 'int' [-Wformat=]
  printf( "\n %s ", frases[n] );
  ^

Créanme que con lo tedioso que me resulta buscar la solución en inglés lo hice por un montón de páginas y no logré dar con la solución, creo que el error lo tengo en la línea 29 pero no lo logro.

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

#define MAX_CHAR 30

void limpiar( void );

int main( void ){
size_t contador=0, ch, n;
char *frases=NULL, *tmpFrases=NULL, ingreso[MAX_CHAR], salir, *p=NULL;

do{
limpiar();
printf("\n Ingrese frase(maximo %d)....: ", MAX_CHAR);
fgets( ingreso , MAX_CHAR, stdin );
if((p=strchr(ingreso, '\n'))){
*p='\0';
}
else{
while((ch = getchar()) !='\n' && ch!=EOF);
}
contador++;

tmpFrases = (char*)realloc( frases, contador * sizeof(char) );

if( tmpFrases!=NULL ){
frases=tmpFrases;
frases[contador-1] = *ingreso ;
}
else{
free( frases );
puts( "Error (re)allocating memory" );
exit(1);
}

printf("\n Para continuar \"S\" para finalizar \"N\"....:");
scanf("%c", &salir);
while((ch = getchar()) !='\n' && ch!=EOF);
}while ( salir != 'n' && salir != 'N' );

printf ("\n Frases introducidas.....: ");
for( n=0; n < contador-1; n++ )
printf( "\n %s ", frases[n] );

free( frases );


return 0;
}

void limpiar( void ){
system("cls||clear");
}

dato000 gracias por ocuparte del tema anterior. -
Saludos
#25
Hola, gente -
Mi pregunta es, ¿hay alguna diferencia en trabajar directamente con un arreglo (en este caso de enteros) o hacer un arreglo de apuntadores a ese arreglo? -
Me construí este pequeño código y me surgió la duda, les agrego otra pregunta por qué seguramente muchos de los que saben en este foro tendrán muchas horas de práctica, ¿se han encontrado en algún momento con la necesidad de utilizar este tipo de código o vieron a otros utilizarlo?

// Viernes 30 sep 2016 20:39:55 ART  Arreglo de apuntadores

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

#define MAX 25

void llenar( int vector[] );
int *arregloPtr( int vector[], int *vectorPtr[] );
void mostrar( int *vectorPtr[] );
   

int main(int argc, char **argv){
int vector[MAX], *vectorPtr[MAX];

llenar( vector );
*vectorPtr = arregloPtr( vector, vectorPtr );
mostrar( vectorPtr );

return 0;
}

void llenar( int vector[] ){
int i;
srand ( time(NULL) );

for( i=0; i<MAX; i++ ){
vector[i] = rand() % 100;
}
}

int *arregloPtr( int vector[], int *vectorPtr[] ){
int i;

for( i=0; i<MAX; i++ ){
vectorPtr[i] = &vector[i];
}

return *vectorPtr;
}

void mostrar( int *vectorPtr[] ){
int i;

for( i=0; i<MAX; i++ ){
if( i % 5 == 0 ){
printf( "\n" );
}
printf( " %2d", *vectorPtr[i] );
}
printf( "\n\n" );
}


Desde ya muchas gracias y saludos.
#26
Hola, gente, como están. -
La consulta es para que me digan que estoy haciendo mal, si está dentro de la función main tengo que utilizar esta sintaxis(línea 16/20)

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

#define MAX 10

int main(void){
int a[MAX];
int (*ptrVector)[MAX] = &a;
int i;
srand (time(NULL));

printf( "\n" );

for(i=0; i<MAX; i++){
(*ptrVector)[i] = rand() % 50;
}

for(i=0; i<MAX; i++){
printf(" %d ", (*ptrVector)[i]);
}

printf( "\n\n" );

return 0;
}


Y si está en otra función esta otra(línea 33/46)

Yo quisiera utilizar siempre la primera pero no sé cómo pasar el puntero correctamente a las funciones. -

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

#define MAX 25

void llenar( int *ptrVector );
void mostrar( int  const *ptrVector );
void sumar( int const *ptrVector );

int main( void ){
int vector[MAX], ( *ptrVector )[MAX] = &vector;

llenar( *ptrVector );

mostrar( *ptrVector );

//sumar( *ptrVector );

printf( "\n\n" );

return 0;
}


void llenar( int *ptrVector ){
int i;
srand( time(NULL) );

printf( "\n" );

for( i=0; i<MAX; i++){
*(ptrVector+i) = rand() % 100;
}
}

void mostrar( int const *ptrVector ){
int i;

printf( "\n" );

for( i=0; i<MAX; i++){
if( i % 5 == 0 ){
printf( "\n" );
}
printf( "   %2d", *(ptrVector+i) );
}

printf( "\n   ----------------------" );

}

void sumar( int const *ptrVector ){
int i; //resultado=0, indice;
//indice = Fila*Numero de columnas + Columna

printf( "\n" );

for( i=0; i<MAX; i++){
}

printf( "\n---------------" );

}


En cuanto a la función sumar todavía no lo logro, pero ya va a salir, seguramente. -

Saludos y como siempre muchas gracias. -








#27
Hola, que tengan un muy buen día.
En mi post anterior utilice este tipo de llamada a función y todo correcto, pero ahora no logro que funcione, reconozco que si leyera en inglés tal vez podría saber el porqué del error pero recién estoy comenzando con el idioma. -

#include <stdio.h>

void uno( );
void dos( );


int main(void){

uno( dos() );

return 0;
}

void uno(  ){
printf( "\n Uno " );
}

void dos(  ){
printf( "\n dos" );
}


Saludos y desde ya muchas gracias. -
#28
Hola, gente.
Estoy muy feliz porque llegue al capítulo archivos, muy esperado por mi porqué es lo que mas necesito aprender en c dado me dará la posibilidad de desarrollar algo que todavía no les puedo decir porque las 2 veces que lo hice en foros me criticaron mucho (mucha energía negativa). -
Como notaran en el menú el programa es un tanto ambicioso para ser el primero, pero de entrada quiero ir a fondo. -
La primer consulta es un segmentation fault que me da en la línea 78 y por supuesto hasta la 90 me podrían decir en que estoy fallando, créanme que consulté páginas, videos (incluso los 3 de Alberto) pero no hallo la solución . -

Errores/dudas/etc.

1 - Segmentation fault
2 - Grabar en archivo linealmente y no en renglones.
3 - Posicionarse en el último registro.  
4 - Salto de línea anticipado en el último campo.
5 - Leer/escribir
6 - Buscar
7 - Borrar
8 - Ordenar



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

typedef struct{
int  orden;
char nombre[50], direccion[50], ciudad[50], correo[50];
char telefono[20], celular[20];
char otros[200];
}Recordatorio;

void limpiar( void );
void menu( void );
void agregar( void );

int main ( int argc, char **argv ){

menu();
       
return 0;
}

void limpiar( void ){
system("cls||clear");
}

void menu( void ){
int opc, ok, ch;

do{
do{
limpiar( );
printf( "\n =============== Menu principal ===============\n"
"\n 1 - Primero"
"\n 2 - Ultimo"
"\n 3 - Buscar"
"\n 4 - Todos"
"\n 5 - Agregar"
"\n 6 - Modificar"
"\n 7 - Borrar"
"\n 8 - Finalizar\n"
"\n ingrese opcion.....:" );

ok = scanf( "%d", &opc ) == 1 && opc > 0 && opc <= 8;
while ((ch = getchar()) != EOF && ch != '\n');
}while( !ok );


switch ( opc ){
case 1: printf( "\n Primero" );
break;
case 2: printf( "\n Ultimo" );
break;
case 3: printf( "\n Buscar" );
break;
case 4: printf( "\n Todos" );
break;
case 5: agregar( );
break;
case 6: printf( "\n Modificar" );
break;
case 7: printf( "\n Borrar" );
break;
}
}while( opc != 8 );

}

void agregar( void ){
Recordatorio *recordatorio = NULL;
FILE *fptr = fopen ( "fichero.txt", "a" );
   
limpiar( );

   if( fptr == NULL ){  
perror(" \n\n Error en la creacion/apertura del archivo" );
}else{
printf( "\n\n Ingrese NOMBRE completo del contacto........: " );
fgets( recordatorio->nombre, 50, stdin );
printf( "\n\n Ingrese DIRECCION del contacto..............: " );
fgets( recordatorio->direccion, 50, stdin );
printf( "\n\n Ingrese CIUDAD donde reside el contacto.....: " );
fgets( recordatorio->ciudad, 50, stdin );
printf( "\n\n Ingrese CORREO del contacto.................: " );
fgets( recordatorio->correo, 50, stdin );
printf( "\n\n Ingrese TELEFONO FIJO del contacto..........: " );
fgets( recordatorio->telefono, 50, stdin );
printf( "\n\n Ingrese CELULAR del contacto................: " );
fgets( recordatorio->celular, 50, stdin );
printf( "\n\n Ingrese OTROS DATOS (200 caracteres)........: " );
fgets( recordatorio->otros, 50, stdin );
       
       fprintf(fptr, "%s", recordatorio->nombre);
       fprintf(fptr, "%s", recordatorio->direccion);
       fprintf(fptr, "%s", recordatorio->ciudad);
       fprintf(fptr, "%s", recordatorio->correo);
       fprintf(fptr, "%s", recordatorio->telefono);
       fprintf(fptr, "%s", recordatorio->celular);
       fprintf(fptr, "%s", recordatorio->otros);
       
fclose ( fptr );
}    
}

Saludos.
#29
Hola, dejo mi humilde aporte al foro con un tema que tiene que ver con esto. -http://foro.elhacker.net/programacion_cc/dudas_con_cola_e_intmax_lenguaje_c-t456602.0.html
Lo que valido en el programa son 4 casos que detallo a continuación y que considero que no debería fallar. -
1 - Que el ingreso no sea cero ni que el primer dígito sea cero. -
2 - Que se ingresen solo dígitos. -
3 - Que no se supere el máximo permitido de dígitos, en mi pc el máximo permitido por el int es
    2147483647 o sea 10 dígitos, si por ej. se ingresaran 11 o más se activaría el mensaje de error. -
4 - Por último si el ingreso es exactamente 10 dígitos, verifico dígito a dígito, si es menor por más
    que el resto sean todos nueves el ingreso es correcto, si por el contrario es mayor por más que el
    resto sean todos ceros el ingreso es incorrecto y si es igual continuo con el siguiente. -
Por último, espero 2 cosas, la primera que me den sugerencia para poder mejorarlo y la segunda es que me gustaría ver la versión de algunos de los expertos del foro, no para competir ya que no puedo todavía darme ese lujo, sino simplemente para que nos beneficiemos los que estamos estudiando el lenguaje. -

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

void valIngInt( void );
void limpiar( void );
int valFinal( char charIngreso[], char charIntMax[] );
void mensaje( int men );

int main( void ){

valIngInt();

return 0;
}

void valIngInt( void ){
int i, ok, cantDigInt, men, numero;
char charIntMax[20], charIngreso[11],aux;

cantDigInt = sprintf(charIntMax, "%d", INT_MAX);

do{
limpiar( );

ok=1, i=0;
printf( "\n Ingrese un numero entero ( mayor a 0 e igual o menor a %d )\n .....:" , INT_MAX);
while ((aux = getchar()) != EOF && aux != '\n'){
if( isdigit(aux) ){
if( i == 0 && aux == '0'){
ok=0;
men = 1;
mensaje( men );
break;
}
charIngreso[i] = aux;
}
else{
ok=0;
men = 2;
mensaje( men );
break;
}
i++;
if( i > cantDigInt ){
ok=0;
men = 3;
mensaje( men );
break;
}
}
charIngreso[i] = '\0';

if( i ==  cantDigInt){
ok = valFinal( charIngreso, charIntMax );
if( ok == 0 ){
men = 4;
mensaje( men );
}
}
}while( !ok );
numero = atoi(charIngreso);
printf( "\n Ingreso.....: %d", numero );
}

void limpiar( void ){
system("cls||clear");
}

int valFinal( char charIngreso[], char charIntMax[] ){
size_t i = 0, ok=1;

while( charIngreso[i] != '\0' ){
if(charIngreso[i] > charIntMax[i]){
ok = 0;
break;
}else if( charIngreso[i] < charIntMax[i] ){
break;
}
i++;
}

return ok;
}

void mensaje( int men ){
int ch;

if( men == 1 || men == 2 || men == 3 ){
while ((ch = getchar()) != EOF && ch != '\n');
}

if( men == 1 ){
printf( "\n El ingreso es incorrecto, el primer digito no puede ser cero\n\n\t");
}else if( men == 2 ){
printf( "\n El ingreso es incorrecto, debe ingresar solo digitos del 0 al 9 \n\n\t" );
}
else if( men == 3 ){
printf( "\n El ingreso es incorrecto, supera el maximo permitido ==> %d \n\n\t" , INT_MAX );
}
else{
printf( "\n El ingreso es incorrecto, supera el maximo permitido ==> %d \n\n\t" , INT_MAX );
}

printf( "Pulse una tecla para intentarlo nuevamente..." ); getchar();
}


Un gran saludo para todos.
#30
Hola, gente, que tengan un muy buen día. -
Tengo claro que deberíamos pedir ayuda cuando el programa falla y este no es el caso (por lo menos es lo que parece) pero estoy tratando de hacer esto solo y como la mayoría sabe no tengo a quien consultar que no sean Uds. los molesto. -    
Mi duda está desde la línea 78 a la 96, ¿es todo correcto lo que se encuentra dentro de esas líneas? y otra cosita, como puedo hacer para liberar la memoria de Elem y elem (lineas 78 y 88).
Me falta la función quitar que intentare luego de vuestra(s) opinión(es) .-
Estoy aprendiendo, por lo tanto, cualquier sugerencia de cambios en el código será bienvenida por dura que sea. -

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

typedef struct ElementoLista{
int dato;
int elementos;
struct ElementoLista *siguiente;
}Elemento;

Elemento *inicio = NULL;
Elemento *fin = NULL;

void menu( void );
void limpiar( void );
Elemento *agregar( Elemento *E );
void mostrar( Elemento *E );

int main( void ){

menu();

return 0;
}


void menu( void ){
int opc, ok, ch;
Elemento *elemento = NULL;

do{
do{
limpiar( );
printf( "\n =============== Menu principal ===============\n"
"\n 1 - Agregar a la cola"
"\n 2 - Quitar de la cola"
"\n 3 - Listar cola"
"\n 4 - Salir\n"
"\n ingrese opcion.....:" );

ok = scanf( "%d", &opc ) == 1 && opc > 0 && opc <= 4;
while ((ch = getchar()) != EOF && ch != '\n');
}while( !ok );


switch ( opc ){
case 1: elemento = agregar( elemento );
break;
case 2: //cola = quitar( elemento );
break;
case 3: mostrar( elemento );
break;
case 4:
free( elemento );
break;
}
}while( opc != 4 );


}

void limpiar( void ){
system("cls||clear");
}


Elemento *agregar( Elemento *E ){
int ok, ch, dto;

do{
limpiar();
printf( "\n Ingrese dato (mayor a 0 y menor a %d)....: ", INT_MAX );
ok = scanf( "%d", &dto ) == 1 && dto >0 && dto <= INT_MAX;
while ((ch = getchar()) != EOF && ch != '\n');
}while( !ok );

if( E != NULL ){
Elemento *Elem = calloc( sizeof( Elemento ), 1 );

Elem->dato = dto;
Elem->siguiente = NULL;
fin = Elem;
Elem->elementos += 1;
E->siguiente = Elem;

return Elem;
}else{
Elemento *elem = calloc( sizeof( Elemento ), 1 );

elem->dato = dto;
elem->siguiente = NULL;
inicio = elem;
fin = elem;
elem->elementos = 1;

return elem;
}

return E;
}

void mostrar( Elemento *E ){
Elemento *auxiliar;  

if( E != NULL ){
auxiliar = inicio;
while( auxiliar != NULL ){
printf( "\n %d", auxiliar->dato );
auxiliar = auxiliar->siguiente;
}
free( auxiliar );
}else{
printf( "\n Cola vacia" );
}
printf( "\n\n Pulse una tecla para continuar..." );
getchar();

}


Saludos.
#31
Hola, que tengan muy buen día. -
Repase el video de donde saque el Ej. una decena de veces y no logro hacer que el programa no me de el error  Segmentation fault, busque también en internet el error del compilador y nada.
Nota: Alberto, mil disculpas por no copiarlo de tu video que por cierto lo vi un par de veces pero este me pareció más acorde a mis conocimientos (así me fue). -
Si además de decirme como solucionarlo (cosa que descarto) si me pondrían poner un poco de teoría del porqué me seria de mucha utilidad para no repetir. -

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

typedef struct ElementoLista{
char *dato;
struct ElementoLista *siguiente;
}Elemento;

typedef struct ListaUbicacion{
Elemento *inicio;
Elemento *fin;
int tamanio;
}Cola;

void inicializacion_cola( Cola *serie);
int insertar_cola( Cola *serie, Elemento *actual, char *dato );
int quitar_cola( Cola *serie );
void imprimir_cola( Cola *serie );

int main( void ){
Cola *serie;
inicializacion_cola( serie );

insertar_cola( serie, serie->fin, "1" );
insertar_cola( serie, serie->fin, "2" );
insertar_cola( serie, serie->fin, "3" );
insertar_cola( serie, serie->fin, "4" );
insertar_cola( serie, serie->fin, "5" );
insertar_cola( serie, serie->fin, "6" );
insertar_cola( serie, serie->fin, "7" );
insertar_cola( serie, serie->fin, "8" );
insertar_cola( serie, serie->fin, "9" );

imprimir_cola( serie );

printf( "\n" );

quitar_cola( serie );
quitar_cola( serie );
quitar_cola( serie );
quitar_cola( serie );

imprimir_cola( serie );

return 0;
}

void inicializacion_cola( Cola *serie){
serie->inicio = NULL;
serie->fin = NULL;
serie->tamanio = 0;
}

int insertar_cola( Cola *serie, Elemento *actual, char *dato ){
Elemento *nuevo_elemento;

if( ( nuevo_elemento = (Elemento *)malloc( sizeof( Elemento ))) == NULL )
return -1;
if( (nuevo_elemento->dato = ( char * )malloc(50 * sizeof (char))) == NULL)
return -1;

strcpy( nuevo_elemento->dato , dato );

if( actual == NULL ){
if( serie->tamanio == 0 ){
serie->fin = nuevo_elemento;
}
nuevo_elemento->siguiente = serie->inicio;
serie->inicio = nuevo_elemento;
}else if( actual->siguiente == NULL ){
serie->fin = nuevo_elemento;

nuevo_elemento->siguiente = actual->siguiente;
actual->siguiente = nuevo_elemento;
}
serie->tamanio++;

return 0;
}

int quitar_cola( Cola *serie ){
Elemento *sup_elemento;

if( serie->tamanio == 0 ){
return -1;
}
sup_elemento = serie->inicio;
serie->inicio = serie->inicio->siguiente;

free( sup_elemento->dato );
free( sup_elemento );

serie->tamanio--;
return 0;
}

void imprimir_cola( Cola *serie ){
Elemento *actual;
int i;
actual = serie->inicio;

for( i=0; i<serie->tamanio; i++ ){
printf( "\n %p - %s", actual, actual->dato );
actual = actual->siguiente;
}
}


CitarProgram received signal SIGSEGV, Segmentation fault.
0x00000000004007d2 in inicializacion_cola (serie=0x0) at Cola.c:50
50      serie->inicio = NULL;   
Saludos.   
#32
Hola, buen día para todos. -
Como me pareció tener claro listas simplemente enlazada http://foro.elhacker.net/programacion_cc/borrar_nodo_en_lista_simplemente_enlazadac-t455556.0.html me metí con lista doblemente enlazada y tengo una parte que no puedo solucionar, me parece que la función crear para el primer nodo funciona, pero cuando agrego 2,3,4 no puede el anterior apuntar a NULL, por más que practique no me sale, por momento parece en mi mente que es una bobada pero cuando lo llevo a la práctica no me resulta. -   
Si le es posible desearía que me digan si la función agregar es correcta. - 

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

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

struct lista{
struct nodo *primero, *ultimo;
int elementos;
};

void menu( void );
void limpiar( void );
struct lista *agregar( struct lista *L );
struct nodo *crear( int dato );


int main( void ){

menu();

return 0;
}


void menu( void ){
struct lista *Lista = NULL;
Lista->elementos=0;
int opc, ok, ch;

do{
do{
limpiar();
printf( "\n ========== Menu Principal ==========\n" );
if( Lista != NULL)
printf( "\n Total de datos.....:%d\n", Lista->elementos );
printf(" \n 1 - Agregar\n 2 - buscar\n 3 - Ordenar " );
printf(" \n 4 - Total\n 5 - Finalizar\n\n Ingrese Opcion....: "  );
ok = scanf( "%d", &opc ) == 1 && opc > 0 && opc <= 5;
while ((ch = getchar()) != EOF && ch != '\n');
}while( !ok );

switch ( opc ){
case 1: Lista = agregar( Lista );
break;
case 2: //Lista = buscar( Lista );
break;
case 3: //ordenar( Lista );
break;
case 4: //mostrar( Lista );
break;
case 5:;
free( Lista );
break;
}
}while( opc != 5 );

}

void limpiar( void ){
system("cls||clear");
}

struct lista *agregar( struct lista *L ){
int ok, ch, dto;

do{
limpiar();
printf( "\n Ingrese dato (mayor a 0 y menor a %d)....: ", INT_MAX );
ok = scanf( "%d", &dto ) == 1 && dto >0 && dto <= INT_MAX;
while ((ch = getchar()) != EOF && ch != '\n');
}while( !ok );

if( L != NULL ){
struct nodo *e = crear( dto );
L->ultimo->siguiente = e;
L->ultimo = e;
L->elementos++;
return L;
}else{
struct nodo *e = crear( dto );
struct lista *l = calloc( sizeof( struct lista ), 1 );
l->primero = e;
l->ultimo = e;
l->elementos = 1;
return l;
}

return L;
}

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

e->dato = dato;
e->siguiente = NULL;
e->anterior = NULL;

return e;
}


Un abrazo. -
#33
Hola, que tengan un muy buen día. -
Tengo actualmente 2 dudas que se encuentran en las funciones menuUno y borrar. -
La primera: necesito alguna validación más o con estas cuatro es suficiente para saber si el nodo es el único y de no ser el único si es el primero o si es el último o está entre ambos. -
La restante es: si dentro de if( L->elementos == 1 )  pongo L=NULL, esto es suficiente y si la función llamadora se entera del cambio o tengo que hacer un return. -

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

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

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

void menu( void );
void menuUno( struct lista *L, struct nodo *N );
void limpiar( void );
struct lista *agregar( struct lista *L );
struct nodo *crear( int dato );
void mostrar( struct lista *L );
void ordenar( struct lista *L );
void buscar( struct lista *L );
void modificar( struct nodo *pivote );
void borrar( struct lista *L, struct nodo *pivote );


int main( void ){
menu();

return 0;
}


void menu( void ){
struct lista *Lista = NULL;
int opc, ok, ch;

do{
do{
limpiar();
printf( "\n ========== Menu Principal ==========\n" );
if( Lista != NULL)
printf( "\n Total de datos.....:%d\n", Lista->elementos );
printf(" \n 1 - Agregar\n 2 - buscar\n 3 - Ordenar " );
printf(" \n 4 - Total\n 5 - Finalizar\n\n Ingrese Opcion....: "  );
ok = scanf( "%d", &opc ) == 1 && opc > 0 && opc <= 5;
while ((ch = getchar()) != EOF && ch != '\n');
}while( !ok );

switch ( opc ){
case 1: Lista = agregar( Lista );
break;
case 2: buscar( Lista );
break;
case 3: ordenar( Lista );
break;
case 4: mostrar( Lista );
break;
case 5:;
free(Lista);
break;
}
}while( opc != 5 );
}

void menuUno( struct lista *L, struct nodo *N ){
int opc, ok, ch;

do{
do{
limpiar();
printf( "\n ========== Menu ==========\n" );
printf(" \n 1 - Modificar\n 2 - Borrar\n 3 - Salir"
   " \n\n Ingrese Opcion....: " );
ok = scanf( "%d", &opc ) == 1 && opc > 0 && opc <= 5;
while ((ch = getchar()) != EOF && ch != '\n');
}while( !ok );

switch ( opc ){
case 1: modificar( N );
opc=3;
break;
case 2: borrar( L, N );
opc=3;
break;
case 3:
break;
}
}while( opc != 3 );
}

void limpiar( void ){
system("cls||clear");
}

struct lista *agregar( struct lista *L ){
int ok, ch, dto;

do{
limpiar();
printf( "\n Ingrese dato (mayor a 0 y menor a %d)....: ", INT_MAX );
ok = scanf( "%d", &dto ) == 1 && dto >0 && dto <= INT_MAX;
while ((ch = getchar()) != EOF && ch != '\n');
}while( !ok );

if( L != NULL ){
struct nodo *e = crear( dto );
L->ultimo->siguiente = e;
L->ultimo = e;
L->elementos++;
return L;
}else{
struct nodo *e = crear( dto );
struct lista *l = calloc( sizeof( struct lista ), 1 );
l->primero = e;
l->ultimo = e;
l->elementos = 1;
return l;
}
}

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

return e;
}

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

if( L != NULL ){
auxiliar = L->primero;
while( auxiliar != NULL ){
printf( "\n %d", auxiliar->dato );
auxiliar = auxiliar->siguiente;
i++;
}
}else{
printf( "\n La lista esta vacia..." );
}

printf( "\n Pulse una tecla para continuar..." );getchar();
}

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;
}
mostrar( L );
}else{
printf( "\n La lista esta vacia..." );
printf( "\n Pulse una tecla para continuar..." );getchar();
}
}

void buscar( struct lista *L ){
int ok, ch, dto, i=0;
struct nodo *pivote = NULL;

if( L != NULL ){
do{
limpiar();
printf( "\n Ingrese el dato a buscar....: " );
ok = scanf( "%d", &dto ) == 1 && dto >0 && dto <= INT_MAX;
while ((ch = getchar()) != EOF && ch != '\n');
}while( !ok );

pivote = L->primero;
while( pivote != NULL ){
if( pivote->dato == dto  ){
menuUno( L, pivote );
i++;
break;
}
pivote = pivote->siguiente;
}
if( i == 0 ){
printf( "\n El dato no existe..." );
printf( "\n Pulse una tecla para continuar..." );getchar();
}
}else{
printf( "\n La lista esta vacia..." );
printf( "\n Pulse una tecla para continuar..." );getchar();
}
}

void modificar( struct nodo *pivote ){
int ok, ch, dto;

do{
limpiar();
printf( "\n Dato a modificar.....: %d \n Ingrese nuevo dato...: ", pivote->dato );
ok = scanf( "%d", &dto ) == 1 && dto >0 && dto <= INT_MAX;
while ((ch = getchar()) != EOF && ch != '\n');
}while( !ok );
pivote->dato = dto;
}

void borrar( struct lista *L, struct nodo *pivote ){

if( L->elementos == 1 ){
printf( "\n Es el unico dato..." );
}
else if( pivote == L->primero){
printf( "\n Es el primer dato..." );
}
else if( pivote->siguiente == NULL){
printf( "\n Es el ultimo dato..." );
}
else{
printf( "\n Esta entre el primer dato y el ultimo..." );
}
getchar();
}


Es todo por el momento, es probable que me surgen algunas otras dudas. -
Saludos.
#34
Hola, que tengan un muy buen día.
Nuevamente Danielito con algún inconveniente con lista enlazada, lo que ocurre es que si ingreso un dato o más todo bien pero si la lista está vacía me da el error que dejo en la imagen a continuación. -
   
                         

Encuentro muchos ejs., pero casi todos son sin ingreso por teclado sino con datos ingresados antes de compilar, me parece que tiene que ver conque la lista esta igualada a NULL o sea que no apunta a ninguna dirección en concreto pero no logro dar con la tecla

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

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

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

void menu( void );
void limpiar( void );
struct lista *agregar( struct lista *L );
struct nodo *crear( int dato );
void mostrar( struct lista *L );

int main( void ){
menu();

return 0;
}


void menu( void ){
struct lista *Lista = NULL;
int opc, ok, ch;


do{
do{
limpiar();
printf( "\n ========== Menu ==========\n" );
printf(" \n 1 - Agregar\n 2 - Buscar\n 3 - Borrar\n 4 - Ordenar " );
printf(" \n 5 - Total\n 6 - Finalizar\n\n Ingrese Opcion....: "  );
ok = scanf( "%d", &opc ) == 1 && opc > 0 && opc <= 6;
while ((ch = getchar()) != EOF && ch != '\n');
}while( !ok );

switch ( opc ){
case 1: Lista = agregar( Lista );
break;
case 2: printf("\n Buscar");
break;
case 3: printf("\n Borrar");
break;
case 4: printf("\n Ordenar");
break;
case 5: mostrar( Lista );
break;
case 6:;
free(Lista);
break;
}
}while( opc != 6 );
}

void limpiar( void ){
system("cls||clear");
}

struct lista *agregar( struct lista *L ){
int ok, ch, dto;

do{
limpiar();
printf( "\n Ingrese dato (mayor a 0 y menor a %d)....: ", INT_MAX );
ok = scanf( "%d", &dto ) == 1 && dto >0 && dto <= INT_MAX;
while ((ch = getchar()) != EOF && ch != '\n');
}while( !ok );

if( L != NULL ){
struct nodo *e = crear( dto );
L->ultimo->siguiente = e;
L->ultimo = e;
L->elementos++;
return L;
}else{
struct nodo *e = crear( dto );
struct lista *l = calloc( sizeof( struct lista ), 1 );
l->primero = e;
l->ultimo = e;
l->elementos = 1;
return l;
}
}

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

return e;
}

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

while( auxiliar != NULL ){
printf( "\n %d", auxiliar->dato );
auxiliar = auxiliar->siguiente;
i++;
}
if( i == 0 ) printf( "\n La lista esta vacia..." );

printf( "\n Pulse una tecla para continuar..." );getchar();
}


Saludos.
#35
Hola, gente.
como se podrán imaginar aveces hago post que se me ocurren a mí solamente, pero si los hago es porque me resulta de mucha ayuda para aprender en serio y no en distintas ocasiones tener que copiar y pegar. -   
Les dejo la función para que en primer lugar me ayuden a documentarla, yo hice algunas lineas para que la tomen como Ej. para que se entienda lo que necesito. -
Si alguien tiene otra versión y la quiere postear, mi agradecimiento. -

struct lista *eliminarIndice( struct lista *L, int indice){
int i = 1;
if( L != NULL ){ // Verificamos que la lista no este vacia.
if( indice <= 10 && indice > 0){ // Si indice es mayor a cero y menor o igual a la cant. de elemento continuamos. 
struct nodo *anterior = L->primero; // Grabamos en anterior la direc. del primer nodo.
struct nodo *pivote = L->primero; // Y lo mismo con pivote.
while( i < indice ){ // Bucle para....
anterior = pivote;
pivote = pivote->siguiente;
i++;
}
if( pivote->siguiente != NULL ){
if( pivote->siguiente != L->primero ){
anterior->siguiente = pivote->siguiente;
free( pivote );
}else{
L->primero = pivote->siguiente;
free( pivote );
}
}else{
if( pivote != L->primero ){
anterior->siguiente = NULL;
free( pivote );
L->ultimo = anterior;
}else{
free( pivote );
}
}
L->elementos--;
if( L->elementos == 0){
free( L );
return NULL;
}else{
return L;
}
}else{
printf( "\n El indice pedido es mayor que los elementos existentes..." );
return L;
}
}else{
printf( "\n No se puede procesar una lista vacia..." );
return NULL;
}
}


Saludos.
#36
Hola, que tengas un muy buen día.



En primer lugar, les consulto si la imagen refleja lo que es un nodo, sin tener en cuenta las direcciones de memoria que no necesariamente son continuas como un vector. -
Y la otra duda es, como debo hacer para que la lista quede ordenada. -
Les pediría un pequeño favor mas, si es posible me ayuden con pseudocódigo quiero encarar la solución por mí mismo, luego si se me queman los papeles les pediré algo de código. -

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


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

struct _agenda *primero, *ultimo;

void mostrar_menu();
void agregar_elemento();
void mostrar_lista();

int main(void){
char opcion, ch;

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();
break;
case '2':  printf("No disponible todavía!\n");
break;
case '3': mostrar_lista(primero);
break;
case '4': exit( 1 );
default: printf( "Opción no válida\n" );
printf( "\n Pulse una tecla para continuar..." ); getchar();
break;
}
} while (opcion!='4');   

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 - Salir" );

printf("\n\n Escoge una opcion......: ");
}

void agregar_elemento(){
struct _agenda *nuevo;
int ch;

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');

nuevo->siguiente = NULL;

if( primero == NULL ){
printf( "\n Primer elemento" );
primero = nuevo;
ultimo  = nuevo;
}else{
ultimo->siguiente = nuevo;
ultimo = nuevo;
}
}


void mostrar_lista(){
struct _agenda *auxiliar; /* lo usamos para recorrer la lista */
int i=0;

auxiliar = primero;
printf( "\n Mostrando la lista completa:\n ");
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();
}



Saludos.
#37
Hola, que tengan un muy buen día. -
Tengo una duda con los miembros de las estructuras y es saber si hay alguna diferencia en declararla de una u otra manera, alguna de las 2 ofrece alguna ventaja, es conveniente hacerlo de una manera o de otra o es exactamente lo mismo, debería saber esto cuando estudiaba las cadenas, pero se nota que me lo saltee. -
Se entiende que me refiero a trabajar con o sin punteros. -

typedef struct{
char nombre[30];
char calle[30];
char ciudad[30];
size_t edad;
}_contacto;


typedef struct{
char *nombre;
char *calle;
char *ciudad;
size_t edad;
}_contacto;


Saludos.
#38
Hola.
Tengo una duda que deseo evacuarla ahora porque me impide seguir estudiando y es: como se pasan los vectores de punteros a las funciones.

void ingreso( char *ptrFrases );
void ingreso( char ptrFrases[] );
int main( void ){
char *ptrFrases = NULL;

ingreso( ptrFrases );
ordenar( ptrFrases );
mostrar( ptrFrases );

return 0;
}
Dejo el programa por si les hace falta para interpretar mejor la duda, luego tengo que continuar consultándolos porque la siguiente linea sé que estoy haciendo todo mal pero es la primera vez que lo intento y realmente no logro solucionarlo, hacer lo mismo con números me funciona a la perfección, en cambio, con cadenas no. -

tmp = (char*)realloc( ptrFrases+i, CARACTERES * sizeof(char) );
if( tmp!=NULL ){
strcpy( ptrFrases[i-1], tmp );
}


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

#define CARACTERES 21
#define safeFree(p) saferFree((void**)&(p))

void ingreso( char *ptrFrases );
void vaciarBuffer( char tmp[] );
void ordenar( char *ptrFrases );
void mostrar( char *ptrFrases );
void saferFree( void **pp );

int main( void ){
char *ptrFrases = NULL;

ingreso( ptrFrases );
ordenar( ptrFrases );
mostrar( ptrFrases );

return 0;
}


void ingreso( char *ptrFrases ){
int i = 0, ok, opc;
char tmp[CARACTERES], ch;

while( 1 ){
printf( "\n Ingrese una palabra(maximo %d caracteres).....:", CARACTERES-1 );
fgets( tmp, CARACTERES, stdin );
vaciarBuffer( tmp );

do{
printf( "\n 1 - Ingresa otra frase\n 0 - Finalisa\n Ingrese opcion...: " );
ok = scanf( "%d", &opc ) == 1 && opc >= 0 && opc <=1;
while ((ch = getchar()) != EOF && ch != '\n');
}while( !ok );
if( opc == 0){
break;
}
i++;
tmp = (char*)realloc( ptrFrases+i, CARACTERES * sizeof(char) );
if( tmp!=NULL ){
strcpy( ptrFrases[i-1], tmp );
}
else{
safeFree( ptrFrases );
puts( "Error (re)allocating memory" );
exit(1);
}
}

}

void vaciarBuffer( char tmp[] ){
char *p = NULL;
size_t ch;

if((p=strchr(tmp, '\n'))){
*p='\0';
}
else{
while((ch = getchar()) !='\n' && ch!=EOF);
}
}

void saferFree(void **pp) {
if (pp != NULL && *pp != NULL) {
free(*pp);
*pp = NULL;
}
}

void ordenar( char *ptrFrases ){
printf( "\n No desarrollado" );
}
void mostrar( char *ptrFrases ){
printf( "\n No desarrollado" );
}

Saludos y gracias. -
#39
Hola, gente.
Les quito un poco de tiempo porque si bien estoy leyendo que es lo que causa el doble free no logro solucionarlo por mí mismo y si lo lograra me quedarían dudas en la función concatenar, les digo esto porque si bien logre que no me diera error en la compilación lo hice a fuerza de prueba/error/solución pero no teniendo claro que es lo que estaba haciendo. -
Las cosas que no me quedan claras:

1): Porque debo hacer que la función se declare como un puntero a función.
2): Porque el error del doble free.
3): Como se hace para poner un espacio entre las dos frases (por programación, claro).-
 
#include <stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAX 51

void ingreso( char origUno[], char origDos[] );
void limpiarBuffer( char cadena[] );
char *concatenar( char *origUno, char *origDos );

int main( void ){
char origUno[MAX] = "", origDos[MAX] = "", *ptrConc = NULL;

ingreso( origUno, origDos );
ptrConc = concatenar( origUno, origDos );

printf("\n %s", ptrConc);

free(ptrConc);

return 0;
}

void ingreso( char origUno[], char origDos[] ){

printf( "\n Ingrese una frase(maximo %d caracteres)............:", MAX-1 );
fgets(origUno, MAX, stdin);
limpiarBuffer( origUno );

printf( "\n Ingrese frase a concatenar (maximo %d caracteres)..:", MAX-1 );
fgets(origDos, MAX, stdin);
limpiarBuffer( origDos );
}

void limpiarBuffer( char cadena[] ){
char *p = NULL;
size_t ch;

if((p=strchr(cadena, '\n'))){
*p='\0';
}
else{
while((ch = getchar()) !='\n' && ch!=EOF);
}
}

char *concatenar( char *origUno, char *origDos ){
size_t totCarac = strlen( origUno ) + strlen( origDos ) + 1;
char *arr = ( char* )malloc( totCarac * sizeof(char) );
arr = strcat( origUno, origDos );

return arr;
}


Saludos y desde ya muchas gracias. -
#40
Hola, gente.
Tengo una pequeña duda con él programara que dejo a continuación y es si esta bien liberada la memoria. -

/*
matriz de punteros de una dimensión.
*/

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

#define MAX 5

int main(void) {
int *arr[MAX], i;
srand(time(NULL));

for( i=0; i<MAX; i++ ){
*(arr+i) = (int*)malloc(sizeof(int));
**(arr+i) = rand() % 100;
printf( "\n %d", **(arr+i) );
}
for( i=0; i<MAX; i++ ){
free(*(arr+i));
}


return 0;

}

Si tienen tiempo y lo desearían necesitaría un poco de teoría al respecto si esta mal como si estuviera bien. -
Saludos y desde muchas gracias como siempre.-
#41
Hola, gente.
Les dejo un ejemplo de lo que digo en el enunciado y la pregunta es ¿hay alguna diferencia en hacerlo de una manera u otra?, los consulto porque me parece que en ningún Ej. vi como lo hago en la segunda llamada a la función. -

#include <stdio.h>

void vector_(int *vt );

int main(void) {
int vector[] = {1, 2, 3, 4, 5}, *vt = vector;

vector_(vt);
printf( "\n" );
vector_(vector);

return 0;

}


void vector_(int *vt ){
size_t i;
for( i=0; i<5; i++){
printf("\n %d", *(vt+i));
}
}

Saludos.
#42
Hola, amigos. -
La duda es ¿debo liberar la memoria con un bucle o simplemente liberar el primer puntero?, lo que me sucede es que no me da ningún error, pero no tengo manera de comprobar si esto es correcto, por lo menos por mis escasos conocimientos de memoria dinámica desconozco cómo podría comprobarlo. -   
Con el barullo que tengo de tantas cosas nuevas no sé si logro hacerme entender, valga el intento. -

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

#define safeFree(p) saferFree((void**)&(p))

void ingreso( void );
void imprimir( int numeros[], size_t contador );
void saferFree( void **pp );

int main( void ){

ingreso();

return 0;
}


void ingreso( void ){
size_t contador=0, ingreso, ch, ok;
int *numeros=NULL, *tmpNumeros=NULL;

do{
do{
printf( "\n Ingrese un numero [0 para finalizar]....:");
ok = scanf( "%lu", &ingreso ) == 1 && ingreso >=0;
while( (ch = getchar()) != '\n' && ch != EOF );
}while( !ok );

contador++;
tmpNumeros = (int *)realloc( numeros, contador * sizeof(int) );
if( tmpNumeros != NULL ){
numeros = tmpNumeros;
numeros[contador-1] = ingreso;
}
else{
safeFree( numeros );
puts( "Error en asignar memoria....." );
exit(1);
}

}while( ingreso >= 1 );

imprimir( numeros, contador );
safeFree( numeros );
}

void imprimir( int numeros[], size_t contador ){
size_t i;

for(i=0; i<contador-1; i++){
printf( "\n %d", numeros[i] );
}
}

void saferFree(void **pp) {
if (pp != NULL && *pp != NULL) {
free(*pp);
*pp = NULL;
        }
}

Debo aclarar que el código es casi todo mío por eso no puedo averiguarlo en el libro con el que estoy estudiando. -
Saludos.


#43
Hola, gente.

CitarPassing a One-Dimensional Array
When a one-dimensional array is passed to a function, the array's address is passed by
value. This makes the transfer of information more efficient since we are not passing
the entire array and having to allocate memory in the stack for it. Normally, this means
the array's size must be passed. If we don't, from the function's perspective all we have
is the address of an array with no indication of its size.

Los consulto porque tengo una duda con esta parte del libro, si mi traductor no falla dice que las matrices se pasan a funciones por valor, yo tengo entendido que el identificador de una matriz contiene la dirección de memoria del primer elemento o primer byte de la misma, por lo tanto, cualquier modificación que se efectué en la función llamada se ve reflejado en la función llamadora como lo refleja el código que dejo a continuación. -

#include <stdio.h>

void ab( int a[], size_t tam );

int main( void ){
int a[] = {5, 3, 8, 99, 11};
size_t tam = 5;

printf( "\n \"a\" antes de la llamada a la funcion vale........:%d", a[0] );
ab(a, tam);
printf( "\n \"a\" despues de la llamada a la funcion vale......:%d\n\n", a[0] );


}

void ab( int a[], size_t tam ){
a[0] = 1;
}

Es todo, espero que alguien me diga como debo interpretar esto. -   

Saludos.
#44
Hola, gente. -
Dejo aclarado que son mis inicios con memoria dinámica y puedo estar preguntando cualquier sandez, hay 2 cosas que me tienen intrigado:

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

int main( void ){
float *V=NULL;
int N=0,i,ch;
char c;

do {
V=( float *)realloc((float *)V,(N+1)*sizeof(float));
printf("\n Ingresa un numero real.................: ");
scanf("%f", &V[N]);
while((ch = getchar()) !='\n' && ch!=EOF);
printf("\n Quieres introducir otro valor? (S/N)...: ");
c=getchar();
N++;
}while (c=='s' || c=='S');

for(i=0;i<N;i++)
printf("\n El valor %d es igual a..................: %f\n", i, V[i]);

free(V);

return 0;
}


     V=( float *)realloc((float *)V,(N+1)*sizeof(float));

En los pocos ejemplos que vi no me parece que estuviera 2 veces en la misma línea el puntero (V) y la otra es ¿no se debería asignar primero con malloc y luego reasignar con calloc? (malloc fuera del bucle do while). -

Es todo, espero me ayuden a aclarar esto. -
Saludos.
#45
Hola, gente.
Alguien conoce algún programa o extensión para Firefox que avise cundo llega un nuevo correo a Yahoo

Desde ya muchas gracias por vuestro tiempo. -
Saludos.