• Sábado 27 de Abril de 2024, 03:06

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 - czealt

Páginas: [1] 2
1
C/C++ / [Código Fuente] mmmm... como hacer un analizador de expresiones regulares
« en: Domingo 26 de Diciembre de 2010, 04:49 »
Definitivamente debe hacer uso de técnicas de parsing. Además se debe definir una estructura de datos \"ExpresionRegular\" para representar a las expresiones regulares. Las expresiones regulares tienen una estructura \"recursiva\" asi que talvez se pueda emplear algoritmos recursivos para manipular dicha estructura de datos. A primera vista no parece ser muy dificil hacerlo de esa manera pero bueno espero haber ayudado en algo. Saludos.

2
C/C++ / [Código Fuente] Motivacion del programa
« en: Lunes 20 de Diciembre de 2010, 02:28 »
La verdad es que queria ver como me salia al hacerlo yo mismo. Despues el resultado me gusto y decidi compartirlo.

PD: No le conteste en Inglés porque aun no domino el idioma tanto como quisiera.

3
C/C++ / [Código Fuente] What\'s the point?
« en: Lunes 20 de Diciembre de 2010, 00:22 »
¿Practicar?

4
C/C++ / Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
« en: Sábado 25 de Septiembre de 2010, 05:47 »
La solucion de Yonimiler esta muy bien si se utiliza C++  :D

Otra solución usando strcpy en lugar de sprintf:

Código: Text
  1.  
  2.   char h[]="Hola foro solo codigo";
  3.   char *tmp;
  4.   while((tmp=strchr(h,' '))!=NULL)
  5.     strcpy(tmp,tmp+1);
  6.   printf("%sn",h);
  7.  
  8.  
Saludos!

Edit: Ja ja ja no me di cuenta que era un hilo un tanto viejo  :wacko:

5
C/C++ / Re: Archivo de configuracion externo al ejecutable
« en: Domingo 12 de Septiembre de 2010, 03:03 »
Puedes usar la función fscanf() de la libreria estandar del C para leer valores númericos desde un archivo. Esta función opera de manera similar a scanf() sólo que en lugar de leer la entrada desde la entrada estandar (stdin) lo hace desde un archivo de disco.

Ejemplo:

valores.txt
Código: Text
  1.  
  2. val1 = 12345
  3. val2 = -256
  4. val3 = -12.335
  5.  
  6.  
  7.  
ejemplo.c
Código: Text
  1.  
  2. #include <stdio.h>
  3.  
  4. int main(void)
  5. {
  6.   FILE *arch_valores=fopen("valores.txt","r");
  7.   int val1,val2;
  8.   float val3;
  9.  
  10.   fscanf(arch_valores,"val1 = %dn",&val1);
  11.   fscanf(arch_valores,"val2 = %dn",&val2);
  12.   fscanf(arch_valores,"val3 = %fn",&val3);
  13.  
  14.   printf("val1 = %d, val2 = %d, val3 = %8.4fn",val1,val2,val3);
  15.  
  16.   fclose(arch_valores);
  17.   return 0;
  18. }
  19.  
  20.  
  21.  
Saludos  :good:

6
C/C++ / [Código Fuente] je je je
« en: Sábado 11 de Septiembre de 2010, 02:06 »
Bueno gracias se hace lo que se puede  :-)

7
C/C++ / Re: Declaraciones C++
« en: Sábado 28 de Agosto de 2010, 02:22 »
Antes que nada un par de aclaraciones:
1. p-v no es un nombre de variable válido; seguramente es p_v.
2. vector es sinónimo de arreglo unidimensional (si es que no se está refiriendo al tipo vector del C++).

Ahora, la manera correcta seria:

float *(*p_v)[8];

Saludos.  ^_^

8
C/C++ / Re: Declaraciones C++
« en: Viernes 27 de Agosto de 2010, 02:21 »
mmmm ya, pondre varios ejemplos similares a los ejercicios que pusiste al principio de modo que puedas resolverlos más facilmente.

1. tipos enumerados

// Declaración del tipo enumerado 'Color' con los valores posibles 'Amarillo', 'Azul', 'Rojo', 'Blanco' y 'Verde'.
typedef enum{Amarillo, Azul, Rojo, Blanco, Verde} Color;

// Declaración del tipo enumerado 'Día'
typedef enum{Domingo, Lunes, Martes, Miercoles, Jueves, Viernes, Sabado} Dia;

2. punteros a funciones

 Para comenzar, de nuevo la regla:

 "Comenzar leyendo la declaración desde el nombre que esta en el parentesis mas interno, despues lee a la derecha y despues a la izquierda. Luego cuando termines de leer el parentesis, saltar hacia afuera y comenzar leyendo de derecha a izquierda nuevamente. Continuar hasta que toda la declaración haya sido leida".

faltaria agregar que durante la lectura cada vez que se encuentre un:
* significa que se tiene un puntero.
( significa que se tiene una funcion.
[ significa que se tiene un arreglo.


Ejemplo:  Declaración de un puntero 'pf' a una función que no toma argumentos y devuelve un int

 int (*pf)();

Apliquemos la regla anterior para comprobar si es lo que se pidio:
Primero empezamos por el elemento que este dentro de los parentesis más internos. En este caso ese elemento es 'pf'. Vemos qué hay a su derecha, encontramos el parentesis de cierre osea que no hay nada a su derecha. Seguidamente vemos qué hay a la izquierda, encontramos un '*' osea que pf es un puntero. Luego, saliendo de dentro de los parentesis (*pf), a la derecha encontramos un '(' entonces tenemos que pf es un puntero a una función. Como inmediatamente encontramos un ')', la función a la que apunta 'pf' no toma argumentos. Hasta aqui tenemos que pf es un puntero a una función que no toma argumentos. Luego nos toca ver a la izquierda, encontramos un 'int' con lo que concluimos que pf es un puntero a una función que no toma argumentos y devuelve un int.

Ejemplo:  Un puntero 'func1' a una función que toma dos argumentos uno int y otro float y no devuelve nada

 void (*func1)(int, float);

Empezamos con el identificador 'func1'. Nada a la derecha; a la izquierda un '*' lo cual nos indica que 'func1' es un puntero. Seguimos, a la derecha esta un '(', entonces tenemos que 'func1' es un puntero a una función. Continuamos hasta encontrar el correspondiente ')' y tenemos que 'func1' es un puntero a una funcion que toma como argumentos un int y un float. Finalmente vemos que a la izquierda se encuentra un 'void' con lo que nuestra lectura quedaria como:'func1' es un puntero a una función que toma como argumentos un int y un float y no devuelve valores


En fin, si aun no se entendio, puedes buscar el google poniendo "Declaraciones complejas en C" o algo similar. Aunque si estas comenzando con el lenguaje C (o C++) es mejor que le prestes atención a otros temas más importantes ya que este tipo de declaraciones complejas no se ven mucho cuando uno programa de manera rutinaria.

Saludos  ^_^

9
C/C++ / Re: Declaraciones C++
« en: Sábado 21 de Agosto de 2010, 02:24 »
Citar
La regla del derecha-izquierda
Esta regla les puede servir para interpretar declaraciones de punteros complejas. La regla dice lo siguiente:
Comenzá leyendo la declaración desde nombre que está en el parentesis más interno, despues leé a la derecha y despues a la izquierda. Luego, cuando termines de leer el parentesis,
saltar hacia afuera y comenzar leyendo de derecha a izquierda nuevamente. Continuar hasta que toda la declaración haya sido leida.

Vamos con un ejemplo:

int * (* (*fp1) (int) ) [10];
Esto puede ser interpretado de la siguiente manera:

1.Comienzo por el nombre de la variable --------------------------- fp1
2.Nada a la derecha, voy a la izquierda y leo * ------------------- es un puntero
3.Salto fuera del parentesis y encuentro (int) --------------------- a una función que recibe un entero
4.Voy a la izquierda y leo * ---------------------------------------------- y retorna un puntero
5.Salto fuera del parentesis, voy a la derecha y leo [10] ----- a un array de 10
6.Voy a la izquierda y leo * --------------------------------------------- punteros
7.Voy a la izquierda y leo int ------------------------------------------- a enteros.
Aca hay otro ejemplo más complicado:

int *( *( *arr[5])())();
1.Comienzo por el nombre de la variable --------------------- arr
2.Voy a la derecha y encuentro un array --------------------- es un array de 5
3.Voy a la izquierda y encuentro * ------------------------------ punteros
4.Salta fuera del parentesis, a la derecha leo () ----------- a funciones
5.A la izquierda leo * ------------------------------------------------ que retornan punteros
6.Fuera del parentesis, a la derecha encuentro () --------- a funciones
7.A la izquierda encuentro * --------------------------------------- que retornan punteros
8.A la izquierda leo int --------------------------------------------- a int's.

Fuente: Wikipedia

10
C/C++ / Re: Declaraciones C++
« en: Viernes 20 de Agosto de 2010, 08:36 »
Hola, bueno las respuestas correctas

EI: NO SE HACEN TAREAS

11
C/C++ / [Código Fuente] Calendario perpetuo
« en: Sábado 24 de Julio de 2010, 07:50 »
Este es un programa que calcula y muestra el calendario (calendario gregoriano) del año dado como entrada.

El programa puede ser compilado con cualquier compilador ANSI-C (osea todos :)).

12
C/C++ / Re: Project Euler (problema 10)
« en: Miércoles 21 de Julio de 2010, 18:17 »
de nada man  :good:

13
C/C++ / Re: Project Euler (problema 10)
« en: Martes 20 de Julio de 2010, 23:54 »
Citar
...el resultado que me da es: 1179908154

pero yo se que ese no es el resultado correcto, el resultado correcto es: 142913828922
Te da ese resultado porque usas una variable de tipo int para contener la suma de los números primos. Las variables de tipo int solo pueden contener valores en el rango
 
 -2147483648 <= int <= 2147483647 (en compiladores de 32 bits)

La suma total de los números (142913828922) queda fuera de ese rango por lo que no puede ser representada con variables int..

Probé usando una variable de tipo double y dio el resultado correcto.

Ah una cosa  más, los indices de los arreglos en C y C++ comienzan en 0 no en 1 asi que también se tuvo que corregir eso

Código: C++
  1.  
  2. ...
  3. int sieve[lim+1];
  4. double sum;
  5. ...
  6. for(i=1;i<=lim;i++){
  7.   if(sieve[i])
  8.     sum+=i;
  9. }
  10.  
  11. printf("%.0fn", sum);
  12.  
  13.  
Saludos.

14
C/C++ / Re: Muchas Gracias de antemano
« en: Lunes 19 de Julio de 2010, 20:13 »
:no: No se  necesita usar backtracking ya que solo hay un camino en la matriz.

15
C/C++ / Re: se vuelve infinito
« en: Lunes 19 de Julio de 2010, 01:11 »
Hola, bueno revise el codigo y vi un error en los indices que utilizas para manipular la matriz 'mat'.
Al declarar:

float mat[3][4];

el primer indice va de 0 a 2 y el segundo de 0 a 3. Por ejemplo el codigo para ingresar los valores de 'mat' deberia ser

Código: C
  1.  
  2.  printf("Ingrese la Matriz 3x4n");
  3.  for(i=0;i<3;i++)
  4.     for(j=0;j<4;j++)
  5.     {
  6.        printf("Ingrese el elemento  %d,%d de la matriz:", i+1,j+1);
  7.        scanf("%f",&mat[i][j]);
  8.     }
  9.  
  10.  
Saludos

16
C/C++ / Re: como asociar dos arreglos unidimensionales
« en: Martes 6 de Julio de 2010, 01:02 »
Cita de: "luchojimenez"
hombre  eso cuando es uno solo y si es  una lista de nombres, frente  a un arreglo de sueldos ingresados por teclado, ambos

OK , aqui esta un programa de ejemplo. El programa pide datos tipo cadena de caracteres y floats , los cuales son dados a travez del teclado, y los almacena en un arreglo unidimensional ...

Código: C
  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. #define LMAX   10000
  6. #define NUMEMP 3
  7.  
  8. char datosempleado[LMAX];
  9. int lon_datos=0;
  10.  
  11. int main(void)
  12. {
  13.   char nombre[100],strsueldo[50],*pchar1,*pchar2;
  14.   float sueldo;
  15.   int i;
  16.  
  17.   /* 1. Leemos los datos en el arreglo */
  18.   for(i=0;i<NUMEMP;i++)
  19.   {
  20.     printf("nDatos del empleado %d:nNombre: ",i+1);
  21.     fgets(nombre,100,stdin);
  22.     nombre[strlen(nombre)-1]='';
  23.  
  24.     printf("Sueldo: ");
  25.     scanf("%f%*c",&sueldo);
  26.     sprintf(strsueldo,"%8.2f",sueldo); /* convierte el sueldo a una cadena de caracteres */
  27.  
  28.     /* almacenamos los datos introducidos en el arreglo datosempleado */
  29.     strcpy(&datosempleado[lon_datos],nombre);
  30.     lon_datos+=strlen(nombre);
  31.  
  32.     datosempleado[lon_datos++]='*'; /* pone la marca que divide a los nombres
  33.                                        de los sueldos */
  34.     strcpy(&datosempleado[lon_datos],strsueldo);
  35.     lon_datos+=strlen(strsueldo);
  36.  
  37.     datosempleado[lon_datos++]='*';
  38.   }
  39.   datosempleado[lon_datos-1]=0; /* marca el fin del arreglo de datos */
  40.  
  41.   /* 2. Se muestra en pantalla los datos almacenados */
  42.   i=1;
  43.   pchar1=datosempleado;
  44.   while(*pchar1)
  45.   {
  46.     int lon_nombre;
  47.     /* extraemos el nombre del arreglo de datos */
  48.     pchar2=strchr(pchar1,'*');
  49.     lon_nombre=pchar2-pchar1;
  50.     strncpy(nombre,pchar1,lon_nombre);
  51.     nombre[lon_nombre]='';
  52.  
  53.     /* extraemos el sueldo */
  54.     pchar2++;
  55.     sscanf(pchar2,"%f",&sueldo);
  56.  
  57.     /* mostrar los datos */
  58.     printf("nEmpleado %d:n"
  59.            "Nombre: %sn"
  60.            "Sueldo: %8.2fn",i++,nombre,sueldo);
  61.  
  62.     pchar1=strchr(pchar2,'*');
  63.     if(pchar1)
  64.       pchar1++;
  65.     else
  66.       break;
  67.   }
  68.  
  69.   return 0;
  70. }
  71.  
  72.  

Saludos.

17
C/C++ / Re: como asociar dos arreglos unidimensionales
« en: Domingo 4 de Julio de 2010, 04:34 »
Aja. Y luego utilizariamos la funcion strchr() para localizar y convertir el sueldo...  :good:
Código: C
  1.  
  2.   char *psueldo, s[]="Angel Perez*311.423";
  3.   float sueldo;
  4.  
  5.   psueldo=strchr(s,'*');
  6.   sscanf(psueldo+1,"%f",&sueldo);
  7.   printf("sueldo:%f n",sueldo);
  8.  
  9.  
  10.  

18
C/C++ / Re: Compila bien y no corre
« en: Jueves 1 de Julio de 2010, 19:51 »
De nada.

19
C/C++ / Re: Compila bien y no corre
« en: Jueves 1 de Julio de 2010, 06:52 »
La condicion de salida del  bucle esta mal. Deberia ser:

  do{
  ....
  }while(dividendo != 0);


y tambien debes efectuar este cambio en la linea 34:

  mcd = divisor;

Saludos.

20
C/C++ / Re: optimizar este codigo
« en: Miércoles 30 de Junio de 2010, 01:25 »
La palabra reservada enum se usa para definir datos del tipo enumerado. Como por ejemplo:

Código: C
  1.  
  2. enum DIA{ Domingo, Lunes, Martes, Miercoles, Jueves, Viernes, Sabado};
  3.  
  4. enum {FALSE, TRUE};
  5.  
  6. enum {NUM1=3, NUM2, NUM3};
  7.  
  8. /*
  9. En el primer caso el compilador asigna por defecto el valor 0 a Domingo, 1 a Lunes, y asi sucesivamente. Lo mismo en el segundo caso. En el tercer ejemplo se asigna el valor 3, 4 y 5 a NUM1, NUM2 Y NUM3 respectivamente. */
  10.  
  11.  

En C las constantes definidas con enum son de tipo int, por consiguiente estas constantes pueden utilizarse en cualquier lugar donde se utilizaria un valor de tipo int, por ejemplo:

Código: C
  1.  
  2. int dia=Lunes;
  3.  
  4.  

Espero haber resuelto tus dudas.  :good:

Saludos.

21
C/C++ / Re: optimizar este codigo
« en: Martes 29 de Junio de 2010, 04:06 »
Hola, le hice algunos cambios a tu codigo: :comp:
Código: C++
  1.  
  2. #include <cstring> // en C++ equivale a string.h
  3. #include <cstdlib>
  4. #include <ctime>
  5. #include <cstdio>
  6. #include <iostream>
  7.  
  8. using namespace std;
  9.  
  10. struct Time
  11. {
  12.   int d,m,y;
  13. };
  14.  
  15. struct Time horalocal()
  16. {
  17.   struct Time mt;
  18.   struct tm *local;
  19.   time_t t;
  20.   t=time(NULL);
  21.   local=localtime(&t);
  22.   mt.d=local->tm_mday;
  23.   mt.m=local->tm_mon+1;
  24.   mt.y=local->tm_year+1900;
  25.   return mt;
  26. }
  27.  
  28. enum{ANIOS,MESES}; // tipos de valores devueltos por fechanac()
  29. int val_dev;    // almacena el tipo de valor devuelto por fechanac()
  30. float fechanac(struct Time t)
  31. {
  32.   struct Time h;
  33.   float year;
  34.  
  35.   val_dev=ANIOS;
  36.   h=horalocal();
  37.   year=h.y-t.y;
  38.   if(year>1)
  39.   {
  40.     if(h.m < t.m)
  41.       year--;
  42.     else if(h.m == t.m && h.d < t.d)
  43.       year--;
  44.   }
  45.   else if((year>=0)&&(year<=1))
  46.   {
  47.     // calculo de los meses transcurridos
  48.     int meses=h.m-t.m;
  49.     if(year==1)
  50.       meses+=12;
  51.     if(meses<12)
  52.     {
  53.       year=meses;
  54.       val_dev=MESES;
  55.     }
  56.   }
  57.   return year;
  58. }
  59.  
  60. void nombre()
  61. {
  62.   system("color 75");
  63.   cout<<"nnn";
  64.   cout<<"                        ==========================="<<endl;
  65.   cout<<"                        =      Programa  Para     ="<<endl;
  66.   cout<<"                        =           Saber         ="<<endl;
  67.   cout<<"                        =          LA Edad        ="<<endl;
  68.   cout<<"                        ==========================="<<endl;
  69.   cout<<"                      By Powered Luis Alfonso Jimenez"<<"nnnn"<<endl;
  70.   system("PAUSE");
  71.   system("cls");    
  72. }
  73.  
  74. int main()
  75. {
  76.   char res;
  77.   do
  78.   {
  79.     nombre();
  80.     system("color 74");
  81.     struct Time fech;
  82.     cout<<"nnintroduce el dia en que naciste"<<endl;
  83.     cout<<"==================================="<<endl;    
  84.     cin>>fech.d ;
  85.     cout<<"ahora el mes   (un numero 1-12)"<<endl;
  86.     cout<<"==================================="<<endl;
  87.     cin>>fech.m ;
  88.     cout<<"ahora el anio"<<endl;
  89.     cout<<"==================================="<<endl;
  90.     cin>>fech.y;
  91.     float edad=fechanac(fech);
  92.     if(val_dev==MESES)
  93.     {
  94.       cout<<"nnTienes "<<edad<<"  meses........nnn"<<endl;
  95.     }
  96.     else
  97.     {
  98.       cout<<"nnTienes "<<edad<<"  años........";
  99.       if((edad>0)&&(edad<30))
  100.       {
  101.         cout<<"........nnn"<<endl;
  102.       }
  103.       else if((edad>=30)&&(edad<40))
  104.       {
  105.         cout<<" y estas en el tercer escalon picarooooon...nnn"<<endl;
  106.       }
  107.       else if((edad>=40)&&(edad<=50))
  108.       {
  109.         cout<<" y estas en el cuarto escalon picarooooon...n...Todo lo que sube tienen caer jajajajannn"<<endl;
  110.       }
  111.       else if(edad>=50)
  112.       {
  113.         cout<<" y estas en la tercera edad picarooooon...n...Perdona que te lo diga pero hueles  camajonnnn"<<endl;
  114.       }
  115.     }
  116.     getchar();
  117.     cout<<"nnnnn Si deseas continuar into S/N"<<endl;
  118.     cin>>res;
  119.     system("pause");
  120.     system("cls");
  121.   }
  122.   while((res=='s')||(res=='S'));
  123.  
  124.   return 0;
  125. }
  126.  
  127.  

...y creo que ahora ya funciona bien :beer:

22
C/C++ / Re: problemas con matrices
« en: Sábado 26 de Junio de 2010, 03:36 »
Bueno si utilizas un compilador de la Borland (Turbo C++, Borland C++ o C++ Builder) puedes usar las funciones de la libreria conio.h para escribir caracteres en cualquier posicion de la pantalla.

El siguiente programa dibuja un cuadro en coordenadas especificas.

Código: C++
  1.  
  2. #include <conio.h>
  3.  
  4. void trazacuadro(int h1,int v1,int h2,int v2)
  5. {
  6.   int v,h;
  7.  
  8.   for(v = v1+1; v < v2; v++)
  9.   {
  10.     gotoxy(h1,v); // ubica el cursor en la posicion (h1,v) de la pantalla
  11.     putch('|');   // escribe el caracter '|' en la posicion del cursor
  12.     gotoxy(h2,v);
  13.     putch('|');
  14.   }
  15.  
  16.   for(h = h1; h <= h2; h++)
  17.   {
  18.     gotoxy(h,v1);
  19.     putch('-');
  20.     gotoxy(h,v2);
  21.     putch('-');
  22.   }
  23. }
  24.  
  25. int main()
  26. {
  27.   clrscr(); // limpia la pantalla
  28.   trazacuadro(5,5,30,20);
  29.   return 0;
  30. }
  31.  
  32.  
  33.  

23
C/C++ / [Código Fuente] El Tetris en C
« en: Viernes 18 de Junio de 2010, 23:59 »
Esta es una implementacion basica del juego esta escrita en C y corre en modo texto.

El programa consta de un solo archivo fuente de 462 líneas y solo utiliza las funciones de la libreria estandar del C y las de la libreria conio.h de Turbo C++.

24
C/C++ / Re: evaluar expresion postfija
« en: Jueves 10 de Junio de 2010, 06:26 »
..Los errores que hacen que el programa no funcione estan en la funcion conversion():
Código: C
  1.  
  2. void conversion(struct pila *cabeza, char cad[]) /* esta funcion modifica la pila asi que el argumento cabeza deberia ser declarado como struct pila **cabeza */
  3. {
  4.     int n1, n2, nuevo, i=0;
  5.     while(cad[i]!='f'){
  6.         if(cad[i]>47 && cad[i]<57)
  7.             apilar(&cabeza, cad[i]); /* Aqui se esta apilando el codigo ASCII del digito en lugar de su valor */
  8.         if(cad[i]>41 && cad[i]<47){
  9.             n1=desapilar(&cabeza); /* El operando que se desapila primero debe ser n2*/
  10.             n2=desapilar(&cabeza);
  11.             nuevo=operacion(n1, n2, cad[i]);
  12.             apilar(&cabeza, nuevo);
  13.         }
  14.         i++;
  15.     }
  16. }
  17.  
  18.  
  19.  

Tambien se deberia verificar si el segundo operando de la operacion / es cero para evitar dividir por 0.

El programa corregido:
Código: C
  1.  
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5.  
  6. enum{DIVCERO=1};
  7.  
  8. const char *msjerror[]={"Division por cero"};
  9.  
  10. int erroreval=0;
  11.  
  12. struct pila{
  13.     int n;
  14.     struct pila *sig;
  15. };
  16.  
  17. void apilar(struct pila **cabeza, int n);
  18. struct pila *nuevoElemento();
  19. int desapilar(struct pila **cabeza);
  20. int pilaVacia(struct pila *cabeza);
  21. int operacion(int n1, int n2, char caract);
  22. void conversion(struct pila **cabeza, char cad[]);
  23. void mostrarPila(struct pila **cabeza);
  24.  
  25. int main(void)
  26. {
  27.     int res;
  28.     struct pila *operandos=NULL;
  29.     char expresion[15];
  30.     printf("nIntroduce la expresion separada por espacios: ");
  31.     gets(expresion);
  32.     printf("nOk...getsn");
  33.     conversion(&operandos, expresion);
  34.     mostrarPila(&operandos);
  35.     if(erroreval)
  36.     {
  37.         printf("Error de evaluacion: %sn",msjerror[erroreval-1]);
  38.     }
  39.     else
  40.     {
  41.         printf("nOk..conversionn");
  42.         res=desapilar(&operandos);
  43.         printf("nOk...resultadon");
  44.         printf("nEl resultado de la expresion es: %dn", res);
  45.     }
  46.     return 0;
  47. }
  48.  
  49.  
  50.  
  51. struct pila *nuevoElemento()
  52. {
  53.     return (struct pila *)malloc(sizeof(struct pila));
  54. }
  55.  
  56. void apilar(struct pila **cabeza, int n)
  57. {
  58.     struct pila *nuevo=NULL;
  59.     nuevo=nuevoElemento();
  60.     nuevo->n=n;
  61.     nuevo->sig=*cabeza;
  62.     *cabeza=nuevo;
  63. }
  64.  
  65. int desapilar(struct pila **cabeza)
  66. {
  67.     int n;
  68.     struct pila *aux=NULL;
  69.     n=(*cabeza)->n;
  70.     aux=*cabeza;
  71.     *cabeza=aux->sig;
  72.     free(aux);
  73.     return n;
  74. }
  75.  
  76. int pilaVacia(struct pila *cabeza)
  77. {
  78.     if(cabeza==NULL)
  79.         return 0;
  80.     return 1;
  81. }
  82.  
  83. int operacion(int n1, int n2, char caract)
  84. {
  85.     int r;
  86.     erroreval=0;
  87.     if(caract=='*')
  88.         r= n1*n2;
  89.     if(caract=='-')
  90.         r= n1-n2;
  91.     if(caract=='+')
  92.         r= n1+n2;
  93.     if(caract=='/')// verificar que n2 no sea 0
  94.     {
  95.         if(n2!=0)
  96.             r= n1/n2;
  97.         else
  98.             erroreval=DIVCERO;
  99.     }
  100.     return r;
  101. }
  102.  
  103. void conversion(struct pila **cabeza, char cad[])
  104. {
  105.     int n1, n2, nuevo, i=0;
  106.     while(cad[i]!='f'){
  107.         if(cad[i]>='0' && cad[i]<='9') // es digito?
  108.             apilar(cabeza, cad[i]-'0'); // convertir a entero antes de apilar
  109.         if(cad[i]=='+' || cad[i]=='-' ||
  110.            cad[i]=='*' || cad[i]=='/'){// es operacion?
  111.             n2=desapilar(cabeza);
  112.             n1=desapilar(cabeza);
  113.             nuevo=operacion(n1, n2, cad[i]);
  114.             apilar(cabeza, nuevo);
  115.         }
  116.         i++;
  117.     }
  118. }
  119.  
  120.  
  121. void mostrarPila(struct pila **cabeza)
  122. {
  123.     struct pila *aux=NULL;
  124.     aux=*cabeza;
  125.     while(aux!=NULL){
  126.         printf("n%d",aux->n);
  127.         aux=aux->sig;
  128.     }
  129. }
  130.  
  131.  

25
C/C++ / Re: archivos
« en: Jueves 10 de Junio de 2010, 04:14 »
Bueno, para leer datos de un archivo binario se usa la funcion fread() que acepta los mismos 4 parametros que la funcion fwrite() solo que en lugar de escribir del buffer al disco se lee del disco al buffer.

Ejemplo:
Código: C
  1.  
  2. void LeerAgenda()
  3. {
  4.   nodoagenda nodo;
  5.  
  6.   FILE *file = fopen("amigos.txt", "rb");
  7.  
  8.   while(fread(&nodo,sizeof(nodoagenda),1,file)) /* fread() devuelve la cantidad de registros leidos, cuando se llega al final del archivo este valor es 0 y el bucle termina. */
  9.   {
  10.     printf("DNI: %dn",nodo.dni);
  11.     printf("Nombre: %sn",nodo.nombre);
  12.     printf("Apellidos: %sn",nodo.apellidos);
  13.     printf("Direccion: %sn",nodo.direccion);
  14.   }
  15.  
  16.   fclose(file);
  17. }
  18.  
  19.  
  20.  

Páginas: [1] 2