Introducción a la programación en C

Sistemas Operativos :: UTN FRBA

2C2015

http://faq.utnso.com/introC

Única función main que recibe una línea de comandos y devuelve un entero

Función es un conjunto de sentencias ordenadas

Imperativo, procedural, tipado estático, tipado débil

¿Qué es un programa en C?

EMPERATIVO

Je

Explicita el paso a paso de la ejecución

“CÓMO”

(no “Qué”)

IMPERATIVO

Como contraste del imperativo, tenemos la programación “declarativa”, muchas veces asociado con lenguajes de programación como Prolog, donde se especifican condiciones, la computación de las mismas se las delegamos al “motor”.

Algunos autores describen a la programación imperativa como “Pasos a solucionar el problema” mientras que la declarativa “describe el problema”

Imperativo y Procedural: ¿Cómo? no ¿Qué?

Tipado estático: Compilador ejerce reglas

Tipado débil: un cacho de memoria

¡¿Tipo qué?!

int (4b)

long long (8b)

char (1b)

float (4b)

double (8b)

structs

punteros (int)

Tipos de datos

http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Referencia

Tipos de datos de tamaño fijo

u_int32 (32 bits) (4 bytes)

u_int16

u_int8

Puede ser unsigned o signed

u_int8 numero;

http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Referencia

int main(void) {

int a = 1; int b = 2; t_persona c;

if (a == b) {

c.edad = a + b;

printf(“a igual b. a+b=%d\n", c.edad);

} else{

printf(“a es distinto (!=) de b\n”);

}

return 0;

}

1

2

3

4

5

6

7

8

9

0

Primer ejemplo en C

TODO

VALOR

SE PUEDE

EVALUAR

if( foo() )

if( a + 2 )

if( a = 5 )

0 es false

1es true

cualquier otro valor

while(a = 5)

while(a == 5)

Estructuras

typedef struct persona{

char nombre[30];

char apellido[60];

int edad;

float altura;

char genero;

} t_persona

Muchas veces se puede abreviar la estructura con la palabra clave “typedef”.

Estructuras

t_persona humano;

humano.edad = 27;

humano.altura = 1.68;

humano.genero = 'h';

strcpy(humano.nombre, "juan");

strcpy(humano.apellido, "perez");

grabar_a_disco(humano);

Muchas veces se puede abreviar la estructura con la palabra clave “typedef”.

int numeros[20];

int i, c = 5;

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

numeros[i] = c;

c++;

}

printf("El tamaño de ‘numeros’ es: %d\n",

sizeof(numeros));

Arrays estaticos

Array: bloque de memoria contigua de tamaño necesario para almacenar la cantidad indicada de variables del tipo indicado

Atento que el vector de 20 posiciones va de la 0 a la 19.

a=

int a[5]

a[70] ?

int main(void) {

int a = 1;

int *c;

c = &a;

a = a+1;

printf( “'a': %d, 'c': %d, '*c': %d\n", a, c, *c);

}

1

2

3

4

5

6

7

8

Operadores & y *

c y a referencian la misma variable

Puntero a un entero

PRESUME

PROGRAMADOR

QUE

EL

SABE

LO

QUE

HACE

int main(void) {

c = &a;

c = c+1;

printf("...

}

Operadores & y * en memoria

Stack

B0CACACA

00000001

B0CACACA

FEDEFE00

+1

B0CACACE

NO EVITA que escribamos código potencialmente INSEGURO

Punteros y memoria dinámica

Código

(ejecución)

Heap

(memoria dinámica)

Stack

?????????????????????????????????????????????????????????

B0CACACA

B0CACACA

39

a

b

int* b = malloc( 50 );
int a = 39;

Un puntero es una variable cuyo contenido tiene una dirección. En esa dirección está realmente lo que uno quiere almacenar.

Además de esto, dado que las variables son memoria y están guardadas en algún lado uno puede averiguar la dirección de memoria que el compilador le asignó a esa variable con el operador &. A simple vista no pareciera ser muy util saber esto, excepto por...

int main(void) {

t_persona* jose;

jose = malloc( sizeof(t_persona));

if( !jose )

printf("Falló el malloc");

jose->dni = 36725812;

free( jose );

}

1

2

3

4

5

6

7

8

9

Memoria dinámica

t_persona* jose;

jose = malloc(...);

jose->dni = 36725812;

Memoria dinámica en memoria

B00B1E55

B0CACACA

Código

Stack

José

FEOFE45

36725812

3

B00B1E55

FE05FE45

Heap

jose

t_persona* hombre;

hombre = malloc( 50 * sizeof(t_persona));

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

(*(hombre+i)).dni = 50;

(hombre+i)->dni = 50;

hombre[i].dni = 50;

}

1

2

3

4

5

6

7

8

9

0

Arrays dinámicos

1

2

3

4

5

6

7

8

9

10

11

12

S

i

s

O

p

\0

1

2

3

4

5

6

7

8

9

10

11

12

S

i

s

O

p

Stream (array de bytes)

String

char* nombre;

nombre = malloc(10);

strcpy(nombre, "Maria");
nombre[4] = 'o';

printf ("Nombre: %s - Longitud: %d\n", nombre, strlen(nombre));


free( nombre );

1

2

3

4

5

6

7

8

9

0

Strings – un array especial

nombre[4]='o';

Strings en memoria

B00B1E55

nombre

Código

Stack

Mario\0&^$%

B00B1E55

Heap

nombre[5]='o';

Strings en memoria

B00B1E55

nombre

Código

Stack

Marioa&^$%

B00B1E55

Heap

EV ITAR

TR AMPA

int elevarAlCuadrado (int);

int main(void) {

int aCuadrado, a = 2;

aCuadrado = elevarAlCuadrado(a);

printf("el cuadrado es: %d\n", aCuadrado );

}

int elevarAlCuadrado (int x) {

return x * x;

}

1

2

3

4

5

6

7

8

9

0

Funciones

void elevarAlCuadrado (int*);

int main(void) {

int a = 2;

elevarAlCuadrado(&a);

printf("el cuadrado es: %d\n", a);

}

void elevarAlCuadrado (int *x) {

*x = *x * *x;

}

1

2

3

4

5

6

7

8

9

0

Pasar como referencia

int main(void) {

char* nombre;

nombre = strdup("Maria");

nombre[4] = 'o';

printf ("El valor de nombre es %s y su longitud: %lu\n", nombre, strlen(nombre));

free( nombre );

}

1

2

3

4

5

6

7

8

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

Nada de lo que vimos anda

¿Cómo puedo hacer esto?

¿Cómo se usa esta función?

¿Existe una función que haga esto?

¿Por qué Sibarita es tan rica?

man

Biblioteca estándar de C

El Trabajo Práctico es grande, pero el soporte es aún mayor.

Stack Overflow: http://stackoverflow.com/questions/tagged/c

Campus virtual: http://www.campusvirtual.frba.utn.edu.ar/especialidad/course/view.php?id=188

Man online: http://linux.die.net/man

Biblioteca estándar de C: http://es.wikipedia.org/wiki/Biblioteca_est%C3%A1ndar_de_C

Si hicieron los ejercicios propuestos, sigan practicando. Cada minuto que pasen ahora, es un minuto que invirtieron.

La imagen es de http://ifanboy.com/

Introducción a C (Vintage revamp) - Google Slides