Está en la página 1de 2

Universidad Catlica Boliviana San Pablo, Maestra en Ingeniera en Computacin, Construccin de Compiladores 1

ResumenEl laboratorio trata de elaborar un programa que lea


una cadena de caracteres con enteros y signos de suma, el
programa debe poder detectar errores en la cadena y de no
existir errores debe devolver el resultado de la suma.


A idea al elaborar el programa fue utilizar comandos de
lectura de caracteres y as diferenciar el tipo de carcter
con una base de comparacin almacenada en vectores, y para
no sobrecargar la memoria, se utilizo programacin de
memoria dinmica.

La idea del programa es leer carcter por carcter ingresado en
la cadena, si lee un nmero el caracter ser almacenado y se
proceder al siguiente caracter, si este es otro nmero se
proceder a concatenar con el caracter previo, si es el smbolo
de suma almacenara el caracter o caracteres previos y as
sucesivamente hasta que termine de leer la cadena, al finalizar
la lectura de cadena se procede a sumar todos los elementos de
la misma.

Si en algn punto de la cadena se detecta alguna condicin de
error el programa informa del mismo y se detiene.

Este es el cdigo del programa:

# include <stdio.h>
# include <stdlib.h>
char prog1[100]="#include <stdio.h> \n#include
<stdlib.h>\nmain(){ printf(";
char prog2[]={
'"','R','e','s','u','l','t','a','d','o','=','%','d','"',',','\0'};
char prog4[]={ ')',';','}','\0'};


char carac,pcarac=0,otro=0;
int numero,multi=1,respop=0,respopaux=0;

struct nodo
{ int num;
char op;
struct nodo *apunta;
};

main(int argc, char *argv[])


{
struct nodo *n1,*nu,*a;
int n,i;
if(argc<3)
{
printf("Introducir dos argumentos\n");
printf("C para archivo para GCC\n");
printf("1 para ver resultado\n");
return 1;
}

if(!strcmp(argv[1],"-l"))
{
clrscr();
n1=(struct nodo *)malloc(sizeof(struct nodo));
n1->apunta=NULL;
nu=n1;
do{
a=(struct nodo *)malloc(sizeof(struct nodo));
carac=argv[2][pcarac];
if((carac<58)&&(carac>47))
{
numero=0;otro=0;
multi=10;
do{
carac=argv[2][pcarac];
if((carac<58)&&(carac>47))
{
pcarac++;
numero=numero*multi+(carac-48);

}
else{ otro=1; }
} while(otro!=1);
a->num=numero;
a->op=32;
}
else{
a->num=0;
a->op=carac;
pcarac++;
}
nu->apunta=a;
a->apunta=NULL;
nu=a;
} while(carac!='\0');
a=n1->apunta;
do {
printf("%d %c \a en la direccion %X\n",a->num,a-
Laboratorio Nro. 1 - (Junio 2013)
Ing. Pablo Fernando Torrejon Ortega.
L
Universidad Catlica Boliviana San Pablo, Maestra en Ingeniera en Computacin, Construccin de Compiladores 2
>op,a->apunta);
a=a->apunta;
} while (a!=NULL);

a=n1;
respop=0;
respopaux=0;
do {
a=a->apunta;

switch(a->op)
{
case '+':{
respop=respopaux+respop;
respopaux=0;
break;}
default:{ respopaux=a->num;
break;}
}
} while (a->apunta!=NULL);
respop=respop+a->num;
printf("La suma es %d \a\n",respop);
getch();
return 0;
}
if(!strcmp(argv[1],"-c"))
{
FILE *fp;
if((fp=fopen("prog1.c","w"))==NULL)
{
printf("No se puede abrir el archivo \n");
return 1;
}
strcat(prog1,prog2);
strcat(prog1,argv[2]);
strcat(prog1,prog4);
printf("\n %s \n",prog1);
fwrite(prog1,sizeof(prog1),1,fp);

fclose(fp);
}
return 0;
}

También podría gustarte