GEE 303 Computer Programming

NEWPORT INTERNATIONAL UNIVERSITY Bogotá, Septiembre de 2011

RICARDO TRIANA

(Lenguaje C)

INDICE INTRODUCCION (1) MARCO TEORICO (2) Historia (2.1) El C de Kernighan y Ritchie (2.2) Quien es Deniss Ritchie? (2.3) Quien es Ken Thompson? (2.4) Filosofia de Programación (2.5) Estructura de un programa en C (2.6) Pros del lenguaje C (2.7) Contras del lenguaje C (2.8) PERFORMANCE REQUIREMENTS (3) (3.1) *Write getfloat, the floating-point analog of getint. What type does getfloat return as its function value? (3.2) *Write a function escape(s,t) that converts characters like newline and tab into visible escape sequences like \n and \t as it copies the string t to s . Use a switch . Write a function for the other direction as well, converting escape sequences into the real characters. (3.3) *Write a program that converts upper case to lower or lower case to upper, depending on the name it is invoked with, as found in argv[0]. (3.4) *A function called abs_val that returns int and takes an int argument. It returns the absolute value of its argument, by negating it if it is negative. A function called output that takes a single character argument and sends it to the program output with putchar. It will remember the current line number and column number reached on the output device—the only values passed to the function are guaranteed to be alphanumeric, punctuation, space and newline characters. (3.5) *Construct a program to test output, where that function is in a separate file from the functions that are used to test it. In the same file as output will be two functions called current_line and current_column which return the values of the line and column counters. Ensure that those counters are made accessible only from the file that contains them. (3.6) *Write and test a recursive function that performs the admittedly dull task of printing a list of numbers from 100 down to 1. On entry to the function it increments a static variable. If the variable has a value below 100, it calls itself again.

(3.7) Then it prints the value of the variable, decrements it and returns. Check that it works. (3.8) *Write functions to calculate the sine and cosine of their input. Choose appropriate types for both argument and return value. The series (given below) can be used to approximate the answer. The function should return when the value of the final term is less than 0.000001 of the current value of the function. CONCLUSIONES (4) BIBLIOGRAFIA (5)

INTRODUCCION (1) A continuación se presentará el desarrollo del trabajo académico para la asignatura CSE 303 de Newport University. Al inicio de este trabajo se presentará un muy "pequeno" marco teorico, donde se explicara de una manera breve que es el lenguaje de programacion C, su historia, se presentarán tambien unas pequenas notas sobre su desarrollo, la historia de sus creadores, estructura, filosofia, y sus pros y contras. Seguidamente se identifican los ejercicios para resolver y sus respectivas soluciones debidamente comentadas. Finalmente, en la bibliografía, se identificarán los diferentes recursos tanto digitales como fisicos utilizados para el desarrollo de este trabajo.

MARCO TEORICO (2)
A continuación se presenta el marco teórico de este trabajo,donde se tocan los siguientes puntos: Historia de C, Kernighan y Ritchie,Quien es Deniss Ritchie?,Quien es Ken Thompson?,Filosofia,Estructura de un programa en C, Pros y Contras. inciamos esta parte del trabajo con la historia de C. 2.1 Historia Desarrollo inicial Supuestamente,el desarrollo incial de C se dio en los laboratirios Bell de la compania AT&T. Según Dennis Ritchie, uno de sus creadores,se le dio el nombre de C ya que era una nueva versión,una evolución,del programa B. Dos historias interesantes,y hasta cierto punto,leyendas,sobre la creación del lenguaje de programación C. Dos de estas "leyendas" son: El desarrollo de C fue el resultado del deseo de los programadores de jugar con Space Travel. Habían estado jugando en el mainframe de su compañía,pero debido a su poca capacidad de proceso y al tener que soportar 100 usuarios,Thompson y Ritchie no tenían suficiente control sobre la nave para evitar colisiones con los asteroides. Por ese motivo decidieron portar el juego a un PDP-7 de la oficina que no se utilizaba; pero esa máquina no tenía sistema operativo,así que decidieron escribir uno. Finalmente decidieron portar el sistema operativo del PDP-11 que había en su oficina,pero era muy costoso,pues todo el código estaba escrito en lenguaje ensamblador. Entonces decidieron usar un lenguaje de alto nivel y portátil para que el sistema operativo se pudiera portar fácilmente de un ordenador a otro. Consideraron usar B,pero carecía de las funcionalidades necesarias para aprovechar algunas características avanzadas del PDP-11. Entonces empezaron a crear un nuevo lenguaje,C. La justificación para obtener el ordenador original que se usó para desarrollar Unix fue crear un sistema que automatizase el archivo de patentes. La versión original de Unix se desarrolló en lenguaje ensamblador. Más tarde,el lenguaje C se desarrolló para poder reescribir el sistema operativo. En 1973,el lenguaje C se había vuelto tan potente que la mayor parte del kernel Unix,fue reescrita en C. Éste fue uno de los primeros núcleos de sistema operativo implementados en un lenguaje distinto al ensamblador. Algunos casos anteriores son el sistema Multics,escrito en PL/I,y Master Control Program para el B5000 de Burroughs, escrito en ALGOL en 1961. 2.2. El C de Kernighan y Ritchie En 1978 Dennis Ritchie y Brian Kernighan publican El lenguaje de programación C en su primera edición,también conocido como La biblia de C,que durante años fue la especificación informal del lenguaje de programacoón C. "El C de Kernighan y Ritchie" es el nombre que se le da al lenguaje descrito en este libro,varios programadores se refieren tambien a este lenguaje como simplemente "K&R C". En El lenguaje de programación C se introdujeron las siguientes características al lenguaje: *El ti po de datos struct.

MARCO TEORICO (2)
*El ti po de datos long int. *El ti po de datos unsigned int. *Los operadores =+ y =- fueron sustituidos por += y -= para eliminar la ambigüedad sintáctica de expre siones como i=-10,que se podría interpretar bien como i =- 10 o bien como i = -10. *"K&R C es el subconjunto más básico del lenguaje que un compilador debe de soportar. Incluso luego de la introducción del ANSI C,fue considerado como "el mínimo común denominador" en el que los programadores debían programar cuando deseaban que sus programas fueran transportables,ya que no todos los compiladores,en ese momento,soportaban completamente ANSI,y el código razonablemente bien escrito en K&R C es también código ANSI C válido." (*The C Book,second edition by Mike Banahan) En las primeras versiones de C,las únicas funciones que necesitaban declaracion, si eran utilizadas antes de la definición de la función eran las que devolvían valores no enteros. Es decir,se asumía que una función que se usaba sin declaración previa devolvería un entero. Ejemplo de llamada que requiere declaración previa: long int cierta_funcion(); int llamando_funcion() { long int ret; ret = cierta_funcion(); } Ejemplo de llamada que no requiere declaración previa: int llamando_funcion() { int ret; ret = alguna_otra_funcion(); } int alguna_otra_funcion() { return 0; } Ya que el "K&R C" no llevaba información alguna sobre los argumentos de las funciones,no se realizaba una comprobación de ti pos en los parámetros de las funciones,aunque algunos compiladores devuelven mensajes de advertencia si se llamaba a una función con un número incorrecto de argumentos. A su vez,para indicar los parámetros que se utilizaban en una función,estos se declaraban de la siguiente manera: int main() { return callme(1, "c");

MARCO TEORICO (2)
int i; char *s; { /*....*/ } } int callme(i, s) A través de los anos se añadieron al lenguaje muchas características "no oficiales",que eran soportadas por los compiladores de AT&T,además de otras características que no eran incluídas en los registros oficiales del lenguaje. Algunas de estas características eran: *Funciones void y el ti po de datos void*. *Funciones que retornaban ti pos de datos struct o union. *Asignación de ti pos de datos struct. *Calificador const, que hace que un objeto sea de sólo lectura. *Una biblioteca estándar,que incorporaba la mayoría de las funcionalidades implementadas por varios desarrolladores de compiladores. *Enumeraciones. 2.3 Quien es Deniss Ritchie? (*Fuente: http://es.wiki pedia.org/wiki/Dennis_M._Ritchie) Nacido el 9 de septiembre de 1941, Dennis Ritchie, es un ingeniero NorteAmericano. Ritchie colaboró en el diseño y desarrollo de los sistemas operativos Multics y Unix,así como el desarrollo de varios lenguajes de programación como el C,sobre el cual escribió un célebre clásico de la Ingeniería de Sistemas,al cual me referí anteriormente,con Brian Wilson Kernighan: El Lenguaje de Programación C. Ritchie recibió el Premio Turing de 1983 por su desarrollo de la teoría de sistemas operativos genéricos y su implementación en la forma del sistema Unix. En 1998 le fue concedida la Medalla Nacional de Tecnología de los Estados Unidos de América. El año 2007 se jubiló,siendo el jefe del departamento de Investigación en software de sistemas de Alcatel-Lucent. 2.. Quien es Ken Thompson? (*Fuente: http://es.wiki pedia.org/wiki/Ken_Thompson) 4 En 1965 Ken Thompson se gradúa en ciencias de la universidad y en 1966 consigue un Master en Ingeniería Eléctrica y ciencias de la computación,en UCLA. En los años 60, Thompson y Ritchie desarrollaron el sistema operativo Multics. Mientras desarrollaba Multics,Thompson creó el lenguaje "Bon",al que llamo así por su esposa, Bonnie. Thompson y Ritchie abandonaron el desarrollo de Multics por su creciente complejidad,y en 1969 desarrollaron el sistema operativo UNIX. Thompson también diseñó el lenguaje de programación B,que como anteriormen se mencionó,es un precursor a C. En el 2 de septiembre de 1992,inventa junto a Rob Pike el código de caracteres UTF-8,pero no fue presentado oficialmente hasta enero de 1993. Junto con Joseph Condon,creó el hardware y el software para Belle,un ordenador de ajedrez. Más adelante,con la ayuda del experto ajedrecista John Roycroft,Thompson distribuyó sus primeros resultados en CD-ROM. El estilo de programación de Thompson ha influenciado notablemente a otros programadores. A finales de 2000,Thompson se retiró de los laboratorios de Bell,para trabajar en Entrisphere donde estuvo hasta 2006. Actualmente trabaja para Google.

MARCO TEORICO (2)
2.5 Filosofia de Programación "*Uno de los objetivos de diseño de C es que sólo sean necesarias unas pocas instrucciones en lenguaje máquina para traducir cada elemento del lenguaje,sin que haga falta un soporte en tiempo de ejecución. Es muy posible escribir C a bajo nivel de abstracción; de hecho,C se usó como intermediario entre diferentes lenguajes."(*The C Book,second edition by Mike Banahan) "*En parte a causa de ser de relativamente bajo nivel y de tener un modesto conjunto de características,se pueden desarrollar compiladores de C fácilmente. En consecuencia,el lenguaje C está disponible en un amplio rango de plataformas (seguramente más que cualquier otro lenguaje). Además,a pesar de su naturaleza de bajo nivel,el lenguaje se desarrolló para incentivar la programación independiente de la máquina. Un programa escrito cumpliendo los estándares e intentando que sea portátil puede compilarse en muchos computadores."(*The C Book, second edition by Mike Banahan)

2.6 Estructura de un programa en C La sentencia más sencilla que se puede escribir en C es la siguiente: main( ) { } Esta sentencia no tiene una funcionalidad especifica,pero contiene la parte más importante de un programa C, además es la sentencia más pequeña que se puede escribir y compilar correctamente. En esta sentencia se define la función main,que es la que ejecuta el sistema operativo al llamar a un programa C. (*Fuente: The Development of the C Language*. Dennis M. Ritchie. Bell Labs/Lucent Technologies. Murray Hill,NJ 07974 USA) El nombre de una función C siempre va seguida de paréntesis,tanto si tiene argumentos como si no. La definición de la función está formada por un bloque de sentencias,que esta encerrado entre llaves {}. Un ejemplo de una sentencia más específica: #include <stdio.h> main( ) { printf("Hello World!\n"); } Con esta sentencia se puede ver la frase Hello World!. En la primera línea indica que se tengan en cuenta las funciones y ti pos definidos en la librería stdio (standard input/output). Estas definiciones se encuentran en el fichero header stdio.h. Ahora,en la función main se incluye una única sentencia que llama a la función printf. Esta toma como argumento una cadena de caracteres,que se imprimen van encerradas entre dobles comillas " ". El símbolo \n indica un cambio de línea. (*Fuente: The Development of the C Language*. Dennis M. Ritchie. Bell Labs/Lucent Technologies. Murray Hill,NJ 07974 USA)

2.7 Pros del lenguaje C

MARCO TEORICO (2)
Estas son algunos de las pros que puede tener este lenguaje de programación,debido a la poca experiencia manejando C,se decidió poner los pros definidos en los diferentes foros de programadores expertos en el lenguaje,asi como en otras fuentes en internet. *C tiene un núcleo de lenguaje muy simple,con funcionalidades añadidas importantes,como funciones matemáticas y de manejo de archivos,proporcionadas por bibliotecas. *Es un lenguaje flexible que permite al programador verstatilidad de estilos. Uno de los estilos más emplea dos es el estructurado "no llevado al extremo". *El lenguaje C impide operaciones sin sentido. *C utiliza un lenguaje de preprocesado,el preprocesador de C,para tareas como definir macros e incluir múlti ples archivos de código fuente. *C tiene acceso a memoria de bajo nivel mediante el uso de punteros. *C tiene Interrupciones al procesador con uniones. *Un conjunto reducido de palabras clave o keywords. *Por defecto, en C, el paso de parámetros a una función se realiza por valor. El paso por referencia se da pasando explícitamente a las funciones las direcciones de memoria de los parámetros con los uqe se esta trabajando. *Ti pos de datos agregados (struct) que permiten que los datos relacionados (como por ejemplo si un empleado,que tiene un id,un nombre y un salario) se combinen y se puedan mani pular como un todo (en una única variable "empleado").

2.8 Contras del lenguaje C Estas son algunas de las contras que puede tener este lenguaje de programación,debido a la poca experiencia manejando C,se decidió poner las contras definidas en los diferentes foros de programadores expertos en el lenguaje,asi como en otras fuentes en internet. *Soporte para programación orientada a objetos,aunque la implementación original de C++ fue un preproc esador que traducía código fuente de C++ a C. *Encapsulación. *Funciones anidadas,aunque GCC tiene esta característica como extensión. *Polimorfismo en tiempo de código en forma de sobrecarga,sobrecarga de operadores y sólo dispone de un soporte rudimentario para la programación genérica. *Soporte nativo para programación multihilo y redes de computadores. *Recolección de basura nativa,sin embargo se encuentran a tal efecto bibliotecas como la "libgc" desarrol lada por Sun Microsystems,o el Recolector de basura de Boehm.

PERFORMANCE REQUIEREMENTS (3)
-Ejercicio 1. Write getfloat,the floating-point analog of getint. What type does getfloat return as its function value? /*Ejercicio 1*/ #include <ctype.h> #include <stdio.h> int getch(void); void ungetch(int); /* getint: siguiente integer del input/ int getint(int *pn) { int c, sign; while (isspace(c = getch())) ; if (!isdigit(c) && c != EOF && c != '+' && c != '-') { ungetch(c); return 0; } sign = (c == '-') ? -1 : 1; if (c == '+' || c == '-') c = getch(); for (*pn = 0; isdigit(c); c = getch()) *pn = 10 * *pn + (c - '0'); *pn *= sign; if (c != EOF) ungetch(c); return c;

}

#include <stdio.h> #define BUFSIZE 100 char buf[BUFSIZE]; int bufp = 0; /* buffer para ungetch */ /* siguiente posicion libre en el buffer*/

PERFORMANCE REQUIEREMENTS (3)
int getch(void) /* Caracter*/ { return (bufp > 0) ? buf[--bufp] : getchar(); } void ungetch(int c) { if (bufp >= BUFSIZE) printf("ungetch: Demasiados caracteres\n"); else buf[bufp++] = c; } #include <ctype.h> #include <math.h> int getfloat(float *fp) { int ch; int sign; int fraction; int digits; while (isspace(ch = getch())) /*Aca se habla de skip white*/ ; if (!isdigit(ch) && ch != EOF && ch != '+' && ch != '-' && ch != '.') { ungetch(ch); return 0; } sign = (ch == '-') ? -1 : 1; if (ch == '+' || ch == '-') { ch = getch(); if (!isdigit(ch) && ch != '.') { if (ch == EOF) { return EOF; } else { ungetch(ch); return 0; } } } *fp = 0; fraction = 0;

PERFORMANCE REQUIEREMENTS (3)
digits = 0; for ( ; isdigit(ch) || ch == '.' ; ch = getch()) { if (ch == '.') { fraction = 1; } else { if (!fraction) { *fp = 10 * *fp + (ch - '0'); } else { *fp = *fp + ((ch - '0') / pow(10, fraction)); fraction++; } digits++; } } *fp *= sign; if (ch == EOF) { return EOF; } else { ungetch(ch); return (digits) ? ch : 0; }

} #include <stdio.h> int main(void) { int ret; do { float f;

fputs("Introduzca un numero: ", stdout); fflush(stdout); ret = getfloat(&f); if (ret > 0) { printf("Ud introdujo: %f\n", f); } } while (ret > 0); if (ret == EOF) { puts("Stopped by EOF."); } else { puts("Stopped by bad input."); } return 0;

}

PERFORMANCE REQUIEREMENTS (3)
-Ejercicio 2 Write a function escape(s,t) that converts characters like newline and tab into visible escape sequences like \n and \t as it copies the string t to s . Use a switch . Write a function for the other direction as well,converting escape sequences into the real characters. /*Ejercicio 2*/ #include <stdio.h>/*Un include*/ void escape(char * s, char * t); void unescape(char * s, char * t); int main(void) { char text1[50] = "\aHello,\n\tWorld! Mistakee\b was \"Extra 'e'\"!\n"; char text2[51]; printf("Original string:\n%s\n", text1); escape(text2, text1); printf("Escaped string:\n%s\n", text2); unescape(text1, text2); printf("Unescaped string:\n%s\n", text1); } return 0;

/* TRADUCCION LITERAL: Se copia el string tal string s, conviertiendo caracteres especiales a su secuencia de escape apropiada. La secuencia complete de escape caraters que se usa en el capitulo 2 se utiliza aca, a excepcion de: \? \' \ooo \xhh Se obvivaron porque se pueden escribir directamente en el codigo fuente. */ void escape(char * s, char * t) { int i, j; i = j = 0; while ( t[i] ) {

PERFORMANCE REQUIEREMENTS (3)
/* Traduccion del caracter especial, si es que existe */

switch( t[i] ) { case '\n': s[j++] = '\\'; s[j] = 'n'; break; case '\t': s[j++] = '\\'; s[j] = 't'; break; case '\a': s[j++] = '\\'; s[j] = 'a'; break; case '\b': s[j++] = '\\'; s[j] = 'b'; break; case '\f': s[j++] = '\\'; s[j] = 'f'; break; case '\r': s[j++] = '\\'; s[j] = 'r'; break; case '\v': s[j++] = '\\'; s[j] = 'v'; break; case '\\': s[j++] = '\\'; s[j] = '\\'; break; case '\"': s[j++] = '\\'; s[j] = '\"'; break;

PERFORMANCE REQUIEREMENTS (3)
default: /* No es una secuencia de escape (escape sequence) asi que solo copiamos los caracteres */ } ++i; ++j; s[j] = t[i];

}

} s[j] = t[i];

/*

El caracter null

*/

-Ejercicio 3 Write a program that converts upper case to lower or lower case to upper,depending on the name it is invoked with,as found in argv[0]. #include <stdio.h>?*Estos son varios de los includes*/ #include <stdlib.h> #include <ctype.h> int main(int argc, char **argv) { int (*convcase[2])(int) = {toupper, tolower}; int func; int result = EXIT_SUCCESS; int ch; if(argc > 0) { if(toupper((unsigned char)argv[0][0]) == 'U') { func = 0; } else { func = 1; } while((ch = getchar()) != EOF) { ch = (*convcase[func])((unsigned char)ch); putchar(ch); }

} else { fprintf(stderr, "Nombre desconocido. No se puede decidir que hacer.\n");

PERFORMANCE REQUIEREMENTS (3)
} } result = EXIT_FAILURE;

return result;

Esta es otra posibilidad de solucion que vi en internet, mi version, manteniendo los creditos del autor, es esta. /* Write a program that converts upper case to lower case or lower case to upper, depending on the name it is invoked with, as found in argv[0]. Assumptions: The program should read from stdin, until EOF, converting the output to stdout appropriately. The correct outputs should be: Program Name lower upper Output stdin with all caps converted to lower case stdin with all lowercase characters converted to uppercase [anything else] helpful message explaining how to use this

Author : Bryan Williams */ #include <stdio.h>/* Estos son los incliudes*/ #include <stdlib.h> #include <ctype.h> #define SUCCESS #define NO_ARGV0 #define BAD_NAME 0 1 2

int main(int argc, char *argv[]) { int ErrorStatus = SUCCESS; int (*convert)(int c) = NULL; int c = 0; /*Chekear que hayan arguments*/ if(SUCCESS == ErrorStatus)

PERFORMANCE REQUIEREMENTS (3)
if(0 >= argc) { printf("Su ambiente no ha dado un solo argumento para el nombre del programa.\n"); ErrorStatus = NO_ARGV0; } } /* Chekear por nombres validos en el argv[0] string */ if(SUCCESS == ErrorStatus) { if(0 == strcmp(argv[0], "lower")) { convert = tolower; } else if(0 == strcmp(argv[0], "upper")) { convert = toupper; } else { printf("Este programa realiza dos funciones.\n"); printf("si el ejecutable se nombra lower entonces convierte todo el input en stdin a bajas.\n"); printf("Si el ejecutable se nombra upper entonces convierte todo el input en stdin a altas.\n"); printf("Si se nombro a porcentajes entonces aparecera este mensaje.\n", argv[0]); ErrorStatus = BAD_NAME; } } /* ok so far, keep looping until EOF is encountered */ if(SUCCESS == ErrorStatus) { while(EOF != (c = getchar())) { putchar((*convert)(c)); } } /* and return what happened */ return SUCCESS == ErrorStatus ? EXIT_SUCCESS : EXIT_FAILURE; } -Ejercicio 4 A function called abs_val that returns int and takes an int argument. It returns the absolute value of its argument, by negating it if it is negative. #include <stdio.h> {

PERFORMANCE REQUIEREMENTS (3)
#include <stdlib.h> main(){ int i, abs_val(int);; for(i = -10; i <= 10; i++) printf("abs of %d is %d\n", i, abs_val(i)); exit(EXIT_SUCCESS);

}

int abs_val(int x){ if(x < 0) return(-x); return(x);

}

-Ejercicio 5 A function called output that takes a single character argument and sends it to the program output with putchar. It will remember the current line number and column number reached on the output device—the only values passed to the function are guaranteed to be alphanumeric,punctuation,space and newline characters. #include <stdio.h>/*includes para stdio.h y stdlib*/ #include <stdlib.h> int curr_line(void), curr_col(void); void output(char); main(){ printf("line %d\n", curr_line()); printf("column %d\n", curr_col()); output('a'); printf("column %d\n", curr_col()); output('\n'); printf("line %d\n", curr_line()); printf("column %d\n", curr_col()); exit(EXIT_SUCCESS);

}

Ejercicio 6

PERFORMANCE REQUIEREMENTS (3)
Construct a program to test output,where that function is in a separate file from the functions that are used to test it. In the same file as output will be two functions called current_line and current_column which return the values of the line and column counters. Ensure that those counters are made accessible only from the file that contains them. #include <stdio.h> int curr_line(void), curr_col(void); void output(char); static int lineno=1, colno=1; int curr_line(void){ return(lineno); } int curr_col(void){ return(colno); } void output(char a){ putchar(a); colno++; if(a == '\n'){ colno = 1; lineno++; } }

Ejercicio 7 Write and test a recursive function that performs the admittedly dull task of printing a list of numbers from 100 down to 1. On entry to the function it increments a static variable. If the variable has a value below 100,it calls itself again. Then it prints the value of the variable,decrements it and returns. Check that it works. #include <stdio.h> #include <stdlib.h> void recur(void); main(){ recur();

PERFORMANCE REQUIEREMENTS (3)
} exit(EXIT_SUCCESS);

void recur(void){ static ntimes; ntimes++; if(ntimes < 100) recur(); printf("%d\n", ntimes); ntimes--;

}

Ejercicio 8 Write functions to calculate the sine and cosine of their input. Choose appropriate types for both argument and return value. The series (given below) can be used to approximate the answer. The function should return when the value of the final term is less than 0.000001 of the current value of the function. sin x = x - pow(x,3)/fact(3) + pow(x,5)/fact(5)... cos x = 1 - pow(x,2)/fact(2) + pow(x,4)/fact(4)... #include <stdio.h>/*includes*/ #include <stdlib.h> #define PI 3.141592 #define INCREMENT (PI/20) #define DELTA .0001 double sine(double), cosine(double); static unsigned int fact(unsigned int n); static double pow(double x, unsigned int n); main(){ double arg = 0; for(arg = 0; arg <= PI; arg += INCREMENT){ printf("value %f\tsine %f\tcosine %f\n", arg, sine(arg), cosine(arg)); } exit(EXIT_SUCCESS);

}

static unsigned int fact(unsigned int n){ unsigned int answer; answer = 1;

PERFORMANCE REQUIEREMENTS (3)
while(n > 1) answer *= n--; } return(answer);

static double pow(double x, unsigned int n){ double answer; answer = 1; while(n){ answer *= x; n--; } return(answer);

}

double sine(double x){ double difference, thisval, lastval; unsigned int term; int sign; sign = -1; term = 3; thisval = x; do{ lastval = thisval; thisval = lastval + pow(x, term)/fact(term) * sign; term += 2; sign = -sign; difference = thisval - lastval; if(difference < 0) difference = -difference; }while(difference > DELTA && term < 16); } return(thisval);

double cosine(double x){ double difference, thisval, lastval; unsigned int term; int sign; sign = -1; term = 2;

PERFORMANCE REQUIEREMENTS (3)
thisval = 1; do{ lastval = thisval; thisval = lastval + pow(x, term)/fact(term) term += 2; sign = -sign; difference = thisval - lastval; if(difference < 0) difference = -difference; }while(difference > DELTA && term < 16); } return(thisval);

* sign;

CONCLUSIONES (4)
Estas son algunas de las conclusiones definitivas para este trabajo académico,cabe recalcar que debido a la poca experiencia manejando C,las conclusiones careceran de peso en cuanto a la parte puramente ejecucional del lenguaje. 1. Es un lenguaje flexible que permite al programador verstatilidad de estilos. Uno de los estilos más empleados es el estructurado "no llevado al extremo". 2. Un conjunto reducido de palabras clave o keywords. Esto es muy importante ya que permite una mani pulacion efectiva del lenguaje de una manera mas rapida y depurada,a comparación de otros lenguajes de programación que requieren una biblioteca de palabras clave extensa. 3. Ti pos de datos agregados (struct) que permiten que los datos relacionados (como por ejemplo si un empleado,que tiene un id,un nombre y un salario) se combinen y se puedan mani pular como un todo (en una única variable "empleado"). 4. Es un lenguaje ligeramente antiguo,a comparacion de otros lenguajes que utilizan integracion directa con ambientes web,utilizandio bibliotecas especificas para cumplir diferentes funciones. 5. Uns falencia de C es no tener un método de encapsulación.Existen métodos de encapsulación con C pero no son nativos del lenguaje. 6. C es un lenguaje utilizado con exito para desarrolo de sistemas operativos. 7. C es un lenguaje muy básico pero que cumple con las expetativas. 8. Para sintetizar "C es un lenguaje de programación de propósito general que ofrece una sintaxis muy breve,un control de flujo y estructuras sencillas y un buen conjunto de operadores. C es un lenguaje pequeño,sencillo y no está especializado en ningún ti po de aplicación. C es un lenguaje relativamente potente,que tiene un campo de aplicación ilimitado y que puede ser aprendido en un tiempo muy corto."

BIBLIOGRAFIA (5)
1. The C Book,second edition by Mike Banahan,Declan Brady and Mark Doran,originally published by Addison Wesley in 1991. 2. Curso de Lenguaje "C". Angel Sabas. Centro de Calculo universidad de Zaragoza. Ener0 1991. http://www.monografias.com/trabajos4/lenguajec/lenguajec.shtml 3. Introduccion a la Programacion en C. Marco A. Pena Basurto,Jose M Cela Espin. Primera edicion Septiembre de 2000. Edisions de la Universitat Politecnica de Catalunya,SL. 4. Estándar Internacional ISO/IEC 9899:TC3 http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf 5. Curso Onlinde de Lenguaje C. http://www.carlospes.com/curso_de_lenguaje_c/

Sign up to vote on this title
UsefulNot useful