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ú

Mensajes - nicolasblues86

#11
no entiendo bien la pregunta pero bueno te pongo un ejemplo de uso de estrocturas en c que tenía por ahí tirado


#include <stdio.h>


struct Ficha {

char Nombre[80];
int  Num_unidades;
int Precio_unidad;
int Estado;   // 0 = moroso; 1 = atrasado; 2 = pagado
};


typedef struct Ficha Fichas;


int main(int argc, char** argv)
{
Fichas Cliente[100];
int i;
char nombre[80];

for (i = 0; i < 99; i++)
{
if (nombre == Cliente[i].Nombre)
{
printf ("%s", Cliente[i].Nombre);
printf ("%i", Cliente[i].Num_unidades);
printf ("%i", Cliente[i].Precio_unidad);
switch  (Cliente[i].Estado)
{
case 0 : printf ("Moroso");
 break;
case 1 : printf ("Atrasado");
 break;
case 2 : printf ("Pagado");
 break;
};
   }
}


return 0;
}













Saludos!!
#12
Claro el problema es que cuando ya se llega a fin de archivo todavía estamos dentro del while ya que feof no mueve el puntero sino que lo hace fscanf por eso cuando llega a fin de archivo todavia tiene que imprimir lo que contiene los printf
lo unico que deberias hacer es cambiar el orden de los printf ponelos arriba del fscanf y si no me equivoco ya estaria solucionado :D


while(!feof(archivo))
{
  printf("Nombre:%s\n", usuario[i].nombre);
printf("Edad:%d\n", usuario[i].edad);
fscanf(archivo, "%s %d",usuario[i].nombre, &usuario[i].edad);


}




Saludos !!!
#13


ya anda joya el problema era con los scanf cuando son cadenas los datos a tratar el '&' no se pone en cambio cuando es un entero si se tiene que agregar el '&'.. el programa ahora andaría aunque  los scanf te van a traer problemas, mejor usa fgets con stdin.. saludos!!



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


struct registro{

    char nombre[10];
    int edad;

};

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

     int n,i;
     struct registro usuario[10];

    FILE *archivo;


    archivo=fopen("usuarios.txt","a+");
    printf("Cuantos usuarios desea ingresar:");
    scanf("%d",&n);

    for(i=0;i<n;i++)
{

printf("Nombre:");
scanf("%s",usuario[i].nombre);
fprintf(archivo,"%s ",usuario[i].nombre);

printf("Edad:");
scanf("%d", &usuario[i].edad);
fprintf(archivo,"%d ",usuario[i].edad);
fprintf(archivo,"\n");

    }
fclose(archivo);
archivo=fopen("usuarios.txt","r");
fscanf(archivo,"%s %d",usuario[i].nombre,&usuario[i].edad);

while(!feof(archivo))
{

fscanf(archivo,"%s %d",usuario[i].nombre,&usuario[i].edad);
printf("Nombre:%s\n",usuario[i].nombre);
printf("Edad:%d\n",usuario[i].edad);

}

  fclose(archivo);

return 0;
}

#15
consiste en dos programas  en el primero se hacen la entrada de datos y en el segundo se realizan modificaciones...
mucha ganas de explicarlo no tengo  :P jeje de ultima si no se entiende un joroca me explico con mas detalle mas tarde..

arch.h




#include <stdio.h>

typedef struct FECHA{

int d, m, a;
}fecha;

typedef struct TIEMPO{

int h, m, s;

}tiempo;

struct atleta{

char nombre[30];
fecha f;
char sx; //sexo
char cat; //categoria
tiempo t;
unsigned int dorsal;
unsigned short puesto;

};

typedef struct atleta atle;
#define desplz(n) (n-1) *sizeof (atle)



archivo de entrada.c




#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "atleta.h"
#define randomize (srand(time(NULL)))
#define random(num) (rand()%(num))

void inicializar (FILE* pf);
void igresar_A (FILE* pf, atle* at);
unsigned numdorsal (char s, char cat, FILE * pf);



int main(int argc, char** argv)
{
FILE *pf;
atle atletas;
char *archivo = "Carrera.dat";
randomize;

if ((pf= fopen( archivo, "wb+")) == NULL)
{
printf ("\n Error al abrir archivo ");
return -1;
}

inicializar(pf);

igresar_A(pf, &atletas);
do
{
fseek(pf, desplz(atletas.dorsal), 0);
fwrite (&atletas, sizeof(atletas),1,pf);
igresar_A(pf, &atletas);

}while (strcmp (atletas.nombre, "FIN"));



fclose (pf);


return 0;
}

void inicializar (FILE* pf)
{
int i;
atle a;

a.nombre[0] = '\0';

for (i=0; i<1000; i++)
fwrite(&a, sizeof(atle), 1, pf);


}

void igresar_A (FILE* pf, atle* at)
{
char buf[30];
int n;

buf[0]='\0';
printf ("Nombre    ");
fgets (buf, 30, stdin);
n = strlen (buf);
if (buf[n] == '\n');
buf[n] = '\0';

sscanf(buf,"%s", at->nombre);
if (strcmp (at->nombre, "FIN"))
{
printf ("ingrese la fecha de naciemiento (dd mm aaaa)");
buf[0]='\0';
fgets (buf, 30, stdin);
sscanf (buf, "%d %d %d", &at->f.d, &at->f.m, &at->f.a);
if (at->f.a < 1954)
at->cat = 'V';
else
at->cat = 'S';

printf ("Sexo (M/F)");
fgets (buf, 3, stdin);
sscanf (buf, "%c", &at->sx);

at->sx = (char) toupper(at->sx);


at->t.h = 0;
at->t.m = 0;
at->t.s = 0;

at->dorsal = numdorsal(at->sx, at->cat, pf);
printf ("%d", at->dorsal);

}
}

unsigned numdorsal (char s, char cat, FILE * pf)

{
unsigned base, tope, d;
atle at;

if (s == 'M' && cat=='V')
{
base = 251;
tope = 500;
}
else if (s == 'M' && cat == 'S')
{
base = 501;
tope = 1000;
}
else if (s == 'F' && cat == 'V')
{
base = 51;
tope = 100;
}
else if (s == 'F' && cat == 'S')
{
base = 101;
tope = 200;
}

d = (unsigned) random(tope+1-base)+base;
fseek(pf, desplz(d),0);
fread(&at,sizeof(atle),1,pf);
if (!(*at.nombre))
return d;
else
return numdorsal(s, cat, pf);

}




archivo de entrada a tiempos de atletas.c





#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "atleta.h"


void muestraDatos (atle at);
void dorsalesjuego (FILE* pf );


int main(int argc, char** argv)
{
FILE * pf;
atle atletas;

unsigned dorsal1;
char dor[20], *archivo = "Carrera.dat";


if ((pf = fopen (archivo, "rb+")) == NULL)
{
printf ("Error al abrir archivo");
return -1;
}

dorsalesjuego(pf);

printf ("Escriba el numero de dorsal: ");
fgets (dor, 5, stdin);
sscanf (dor, "%u", &dorsal1);
while (dorsal1)
{
fseek(pf,desplz(dorsal1), 0);
fread(&atletas, sizeof(atletas),1,pf);

if (*atletas.nombre)
{

muestraDatos(atletas);
printf ("\n Tiempo realizado en minutos y segundos: ");
   fgets (dor, 15, stdin);
   sscanf (dor, "%d %d", &atletas.t.m, &atletas.t.s);
   fseek(pf,desplz(dorsal1), 0);
   fwrite(&atletas, sizeof(atle),1,pf);
}
else
printf ("Dorsal no encontrado, vuelva a intentar\n");

fgets (dor, 5, stdin);
sscanf (dor, "%u", &dorsal1);

}


fclose(pf);




return 0;
}


void muestraDatos (atle at)

{
printf ("Nombre : %s\n", at.nombre);
printf ("Fecha de naciemiento : %d-%d-%d\n", at.f.d, at.f.m, at.f.a);
printf ("Categoria : %c\nDorsal: %u\n", at.cat, at.dorsal);
if (at.t.m > 0)
printf ("\ntiempo de carrera : %d Min %d Seg", at.t.m, at.t.s );



}


void dorsalesjuego (FILE* pf )

{
atle at;

printf ("jugadores en jeugo \n");

while ( !feof(pf) )
{
fread (&at, sizeof(atle),1,pf);
if (*at.nombre)
printf ("numero de dorsal %d\n", at.dorsal);
}


}




eso fue todo saludos


 
#16
jajaja

Alta discusión!! :D

en algo si te voy a dar la razón, ahora ya que leí bien detenidamente todo!

si es verdad que en un principio se quiere hacer con lineas (y pido perdón por eso me deje levar por lo picante de la discusión :D), 

pero en algo me tenes que dar la derecha en el codigo que puse anteriormente el numero de palabras tambien es indeterminado, limitado, pero indeterminado, uno puede poner tanto  como 5,  6  o  30 palabras , no vas a poder poner mil claro está, asi que en esencia se cumple lo de indeterminado.


Saludos Cordiales 


#17

CitarEl codigo original intentaba hacer exactamente eso. ¿No?

no.. el codigo original del principio el numero determinado es ingresado de antemano por el usuario, se pide el numero el usuario lo ingresa y recién ahí reserva la memoria, cuando hablamos de numero indeterminado de palabras y ni el usuario sabe exatamente cuantas palabras va a escribir, mi codigo obiamente esta limitado por 120 caracteres, pero te repito yo nunca dije que era la manera mas obtima sino la mas sencilla   
#18
CitarEsa parte es la que me gustaria ver, como lees digamos 300 palabras y despues podes acceder a ellas. Ese codigo por lo pronto lee una sola palabra.


Heee?¿?¿?¿?¿?
que lee una sola palabra???... no capo! lee una cadena que es muy diferente en ella puede aver una palabra de 120 caracteres (la cual no existe) como tambien puede haber 50 palabras o 20 o una sola por eso uso fgets !!!  

a ver vamos por por partes aca ta el codigo:

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

int main(int argc, char** argv)
{
char* pt;
int tam;
char b[120];

fgets (b, 120, stdin);
tam =  ((strlen (b) + 1 ) * sizeof(char) ) ;
pt = (char*) malloc (tam);

/* Apartir de aca se treta a pt como si fuese un array normal */

return 0;
}



digamos que nosotros ingresamos "hola!! a todos com andan?? espero que bien.. chau"

el codigo reserva memoria para alamacenar esa cantidad de caracteres en pt

ahora si nosotros queremos ingresar esos caracteres en pt podriamos hacer por ejemplo:



strcpy(pt, b);
puts (pt); //muestra en contenido de pt








EI: juntando mensajes.

Citarbuenas, tengo un problemilla, quiero hacer un programa que acepte un numero indeterminado de palabras y las imprima por pantalla(esto último solo para ver si funciona), había pensado algo así pero no va, una ayudita por favor

decime porfavor en que parte dice lo de numero indeterminado de lineas yo no lo veo
la propuesta inicial era esta que despues se haya deformado es otra cosa

Saludos!
#19
obvio que estoy usando un array bidimensional, solo di ejemplo de como se podria llegar hacer usando ese método, sigo pensando que la manera mas sencilla  es con un array unimecional dinámico :



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

int main(int argc, char** argv)
{
char* pt;
int tam;
char b[120];

fgets (b, 120, stdin);
tam =  ((strlen (b) + 1 ) * sizeof(char) ) ;
pt = (char*) malloc (tam);

/* Apartir de aca se treta a pt como si fuese un array normal */

return 0;

}




OJO!!! yo no digo que esta sea la manera mas optima de hacerlo, solo digo que es la mas simple obviamente estamos limitados por 120 caracteres y tenemos reservado ese espacio estatico,  se puede profundizar mucho más pero la pregunta inicial iba a esto

Saludos Cordiles  

#20
Cita de: Eternal Idol en 19 Mayo 2010, 08:12 AM
Cita de: nicolasblues86 en 19 Mayo 2010, 04:19 AM
no entiendo para que haces que 'vect' sea un puntero de puntero si lo que queres hacer es reserva la cantidad justa de memoria para la cantidad de palabras ingresadas, se puede hacer que vect sea tan solo un puntero a char :

Es lo logico, un array bidimensional es un doble puntero. Mostranos en tu caso como leerias las palabras y accederias a ellas posteriormente ...

sigo sin entender, ya se que un array bidimensional es un doble puntero, lo que no entiendo es para que sirve en este ejercicio en particular es complicarse la vida, si con un solo array dinámico se puede hacer tranquilamente el problema no exige mas que eso, salvo que yo lo alla entendido mal  :-\ pero hasta donde se es guardar palabras o mejor dicho una cadena en una array cuyo tamaño definimos en tiempo de ejecución, por eso digo que seria mas facil usar un array de una dimencion y extenderlo tanto como sea necesario de ultima lo que se puede hacer por cada linea que se escribe una fila diferente ahí si hace falta recurrir a la  bidimensionalidad    :



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10

void entrada (char* cd[])

{

char aux[120];
int j, tam;

printf ("escribe %d linea de texto \n", N );
for (j = 0; j < N; j++)
{
fgets (aux, 120, stdin);
tam = ((strlen(aux) +1) * sizeof(char)  );
cd[j] =  (char*) malloc (tam);
sscanf (aux, "%s", cd[j]);
}
}


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

char * cad[N];

entrada (cad);



return 0;
}