Curso Basico Sobre C

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 50

C

From an exam

#include <string.h>

int foo(void) {
char bar[128];
char *baz = &bar[0];
baz[127] = 0;
return strlen(baz);
}

char blah[] = "fizzbuzz";


printf("%s\n", blah+4);

//CHECk
/*
¿Cuáles de los siguientes son verdaderos de la memoria devuel
ta a través de la función malloc? Marque todo lo que correspo
nda.
*/

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

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


unsigned int i;
unsigned int k = atoi(argv[1]);

C 1
char *buf = malloc(k); /* 1 */
if(buf == 0) {
return -1;
}

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


buf[i] = argv[2][i]; /* 2 */
}

printf("%s\n", buf); /* 3 */

return -1;
}

//CHECK
/*
¿Cuáles de las siguientes son afirmaciones verdaderas sobre e
l program stacks?
*/

//CHECK
/*
Which of the following are true of the X86 call instruction?
¿Cuáles de los siguientes son verdaderos de la instrucción de
llamada X86?
*/

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

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


int **blah2 = malloc(sizeof(int*)*N);
int *special = NULL;

C 2
int i, j;

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


int *tmp = (int *)malloc(sizeof(int)*M);
memset((void *)tmp, 0, sizeof(int)*M);
if(i > N) {
special = &tmp[3];
}
blah2[i] = tmp;
}

if(special != NULL) {
*special = 7;
}

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


for(j = 0; j < M; j++) {
printf("%d ", blah2[i][j]);
}
printf("\n");
}

return 0;
}

Lenguaje de bajo(alto) nivel.

Detalles
C es case-sensitive.

Debe colocar ; al final de cada sentencia.

Incluir las librerias necesarias

En VSCode instalas gcc para correr C (comando: gcc <name>.c -


o <name>)

C 3
Es buena practica colocar un return al final

Hay mas formas de imprimir en C ,printf es exclusivo de


<stdio.h>

Con char el contenido no esa “” pero si ‘’

En C variable del mismo tipo pueden ser declaradas y


asignadas juntas: int a = 9, b = 3;

Para retornar valores booleanos True o False, C usa 0 y 1

Los arrays solo contienen un tipo de dato.

Key Words
Palabras clave

En la tabla siguiente se listan todas las palabras clave


reservadas por el lenguaje C. Cuando el lenguaje de
programación actual es C o C++, estas palabras clave no se
pueden abreviar, utilizarse como nombres de variable o
utilizarse como cualquier otro tipo de identificador.

auto else long switch

break enum register typedef

case extern return union

char float short unsigned

const for signed void

continue goto sizeof volatile

default if static while

do int struct _Packed

double

Data types

Type Description Values

-2,147,483,648 to
int a whole number
2,147,483,647

C 4
a number with possible
float 6 decimal places
decimals

a number with possible


double 15 decimal places
decimals

stores one character (letter


char a single character
or number)

sizeof

sizeof es una funcion de C que nos permite saber cuanto


espacio en memoria ocupa una variable o un tipo de dato.

#include <stdio.h>
void main(){
int a;
char b;
double c;
float d;

char e = 'S';
int f = 10;

printf("Asi podemos ver cuanto espacio ocupan: %lu",sizeof


(c));
}

😉
// Si no entiende que es %lu baje a formato de datos en la
parte de simbolos to replace.

existe un valor minimo segun el tipo de dato:

Type Value

char 1 byte

int 4 byte

double 8 byte

float 4 byte

C 5
Variables
Declarar varibles

#include <stdio.h>
void main(){
int num,minNum,maxNum;
num = 12;
minNum = 1;
maxNum = 100;
}

Char

When declaring a char , you need single quotes around it:

char foo = 'a';


char goo = '2';

Incrementar

Para incrementar variables en C podemos hacerlo de la manera


larga o corta.

#include <stdio.h>
void main(){
int number = 0;
int new_number = number + 1; // forma larga
int other_number = ++number; // forma corta
}

Para incrementar colocamos dos ++ delante de la variable,


para decrementar son dos guiones ——, incremento y asignacion
+= o decremento y asignacion -=

#include <stdio.h>
void main(){

C 6
int new_number, other_number;

int number = 0;
new_number += 9;
other_number -= number;
}

Dato sorprendente:

En C podemos asignar valores a una variable dentro de otra


asignación.

#include <stdio.h>
void main(){
int number = 5;
int other_number = number = number + 10;
}

const

Cualquier tipo de dato básico en C, como los que hemos


repasado, se puede declarar como una constante usando la
palabra clave const antes del tipo. Entonces, en lugar de
nuestra plantilla de type variable_name , sería const type variable_name .
También es una buena práctica utilizar todas las letras
mayúsculas al declarar una constante:

const int DAYSINWEEK = 7;

De un tipo a otro (numeros)


Casting Types
A veces es útil, o incluso necesario, cambiar el tipo de
valor de una variable y usarla para otros fines. Por ejemplo,
si tuviera un double puntaje porcentual en una prueba, digamos

C 7
0.95, lo más probable es que desee mostrar el 95% al
usuario. Tenga en cuenta que no estamos cambiando el tipo de
variable ni el valor almacenado en la variable de origen.

Lo que estamos haciendo es mostrar la variable modificada


como un tipo nuevo o almacenarla en una variable diferente
que podría ser de un tipo diferente.
Entonces no podrías hacer esto:

int a;
double b = 3.0;
a = b;

Hay dos tipos de conversiones, implícitas y


explícitas. Cuando configura una variable para que sea igual
a otra, como la a = b anterior, pero sus tipos no coinciden, el
compilador intentará convertirlos.

Sin embargo, esto puede ser peligroso ya que es posible que


no sepa qué valores habrá en la variable en tiempo de
ejecución y es posible que no se pueda convertir
implícitamente a otro tipo. Nuestro ejemplo anterior estaba
implícito, el compilador en este caso hará una mejor
suposición.

La otra forma de convertir una variable de otro tipo es


explícitamente. Puede hacer esto simplemente diciéndole al
compilador en qué tipo desea configurarlo.

Entonces, en nuestro ejemplo anterior, podríamos cambiar la


línea a = b a a = (int)b . De esa manera, si b fuera algo diferente
a 3.0, como 3.2, le estamos diciendo al compilador que lo
haga funcionar, por lo que lo configuraría en 3.

C 8
// Implicitamente
#include <stdio.h>

int main() {

double testScore = 95.7;


int displayScore = 0;

displayScore = testScore; // implicitamente no colocamos


delante el tipo de dato al que queremos cambiar

// No need to change below here


printf("Great work, you got a %d%% on your test\n", disp
layScore);

// Explicitamente
#include <stdio.h>

int main() {

double testScore = 95.7;


int displayScore = 0;

displayScore = (int)testScore; // explicitamente colocam


os delante el tipo de dato al que queremos cambiar

// No need to change below here


printf("Great work, you got a %d%% on your test\n", disp
layScore);

C 9
}

Fuente:

| Codecademy
Sometimes it's useful, or even necessary, to
change the value type of a variable and use it
for other purposes. For instance, if you had a
https://www.codecademy.com/courses/learn-c/l
essons/variables-c/exercises/casting-types

De un tipo a otro (char)

Casting Types
Una opción de conversión más interesante es convertir char a en
un tipo de número, o al revés. Al igual que antes, debe tener
cuidado con la configuración de esto. En el back-end, a char no
almacena 'a' , almacena el valor que representa eso: 97 para
minúsculas y 65 para mayúsculas.

int targetInt;
char sourceChar = 'a';
targetInt = (int)sourceChar;

Ahora targetInt es igual a 97.


Cuando conviertes an int a a char , obtienes el proceso opuesto
y char se establece en el valor en el int valor. Así que si lo
hiciste:

int sourceInt = 65;


char targetChar;
targetChar = (char)sourceInt;

targetChar ahora es igual 'A' .

C 10
// Implicitamente
#include <stdio.h>

int main() {

double testScore = 95.7;


int displayScore = 0;

displayScore = testScore; // implicitamente no colocamos


delante el tipo de dato al que queremos cambiar

// No need to change below here


printf("Great work, you got a %d%% on your test\n", disp
layScore);

// Explicitamente
#include <stdio.h>

int main() {

double testScore = 95.7;


int displayScore = 0;

displayScore = (int)testScore; // explicitamente colocam


os delante el tipo de dato al que queremos cambiar

// No need to change below here


printf("Great work, you got a %d%% on your test\n", disp
layScore);

C 11
}

Fuente:

| Codecademy
A more interesting casting option is converting
a char to a number type, or the other way
around. Just like before, you have to be
https://www.codecademy.com/courses/learn-c/l
essons/variables-c/exercises/casting-types-cont
inued
Almacenamiento
Exsisten 4 tipos de almacenamientos en C
Automatic ● External ● Static

Automatico = Variables Local


Una variable es local cuando se define en el interior de una
función. Esta variable será accesible desde dentro de la
función y tendrá una duración temporal en tiempo de ejecución
hasta que la función acabe.

External = Variable Global

Una variable global


es aquella que se define fuera del cuerpo de cualquier

C 12
función, normalmente al principio del programa, después de la
definición de los archivos de biblioteca (#include), de la
definición de constantes simbólicas y antes de cualquier
función.

Statica = Variable que Persiste


En el lenguaje de programación C se usa static con variables
globales y funciones para restringir su ámbito al archivo
donde se definen. Con variables locales, static se usa para
almacenar la variable en la memoria asignada de forma
estática en lugar de en la memoria asignada de forma
automática

Variables tipo puntero


Detalles variables tipo puntero:

Despues de usar el * en la declaracion de una variable de


tipo puntero no se usa mas.

C 13
Las direcciones en memoria son relativas.

Aveces con los signos de incremento da error las variables


puntero

Las variables son un tipo de datos que almacena direcciones


de memoria o apunta hacia la dirección de una variable (son
variables especiales).

Declaración de punteros:

#include <stdio.h>

void main(){

int *ptro; // para que sea de tipo puntero se coloca delan


te del nombre un *

Las variables de tipo puntero solo siguen las direcciones de


memoria del tipo de dato para la que fueron declaradas, por

C 14
ejemplo: no es lo mismo un puntero de tipo entero que tipo
double. tienen objetivos diferentes.

Con scanf utilizamos & para acceder a la dirección de memoria


de las variables y así asignarles un valor.

Declaración de variables que contienen su dirección:

C 15
#include <stdio.h>

void main(){
int &a; // accedemos a su ubicacion en memoria(direccion)
int *ptro = &a; //almacena la direccion de la variable a
}

Podemos declarar punteros genéricos (no son muy usados) con


la palabra clave void.

Indirección de punteros:
Con la indirección de punteros podemos saber que valor esta
ocupado esa ubicación.

C 16
No es lo mismo declarar una variable de tipo puntero (int
*prt = &num;) a llamarla en una sentencia e.x en un printf.
Eso es indirección

#include <stdio.h>

void main(){
int num = 12;

int *ptro;

ptro = &num;

printf("Valor de direccion %d",*ptro); //indireccion


(acceder al valor que se guarda en la ubicacion de memoria
que tiene el puntero)

printf("\nDireccion en memoria %p",ptro); // direccion


de la variable en memoria (es variable)

*ptro = *ptro + 5;

C 17
printf("\nValor de direccion %d",*ptro); //**MODIFICAD
O**indireccion (acceder al valor que se guarda en la ubica
cion de memoria que tiene el puntero)
}

Formateo de datos
Formateo de datos

//si es necesario 'formatear' en C para imprimir datos


/*
#include <stdion.h>
void main(){
int num,minNum,maxNum;
num = 12;
minNum = 1;
maxNum = 100;
}
*/

printf("%i",num);

Simbolos to replace

To indicate a variable type you want to replace:

symbol type

%d or %i int

%f double or float

%c char

%lu especificador

%p punteros

C 18
Para indicar cuantos decimales mostrar despues del punto
podemos decir:

printf("%.2f"); //especificamos que solo dos decimales des


pues del punto

Commans to format

symbol effect

\n newline

\r carriage return

\t tab

Input and Output


input
scanf

#include <stdio.h>

void main(){
int a,b;
printf("Ingrese un numero... ");
scanf("%i",&a); // & al lado de la variable es necesar
io
printf("Ingrese un numero... ");
scanf("%i",&b); // porque atrapa los valores y los col
oca en las variable que le signamos
printf("la suma de ambos es: %i ",a+b);

return 0;
}

Why &?

C 19
While scanning the input, scanf needs to store that input
data somewhere. To store this input data, scanf needs to
known the memory location of a variable. And here comes the
ampersand to rescue.

& is also called as address of the operator.


For example, &var is the address of var.

Podemos obtener varios datos en el mismo scanf:

scanf("%d %d",&a,&b);

Output

Estructuras de datos
Definición : Las estructuras de datos en programación son
un modo de representar información en una computadora, aunque
además, cuentan con un comportamiento interno
. ¿Qué significa? Que se rige por determinadas
reglas/restricciones que han sido dadas por la forma en que está
construida internamente.

Condicionales
Las condicionales en C siguen la misma estructura que en
lenguajes como JavaScript.

#include <stdio.h>

void main(){
/*code*/
int a = 9, b = 2;

C 20
if (a < b)
{
/* code */
printf("Este numero es mayor");
}else{
printf("Este numero es mayor");
}
}

En caso de tener varias condiciones podemos usar else if()

printf("\n\n");

// EJERCICIO #2
int nota;

printf("ingrese su nota: ");


scanf("%d",&nota);

if(nota >= 95){


printf("Mereces beca");
}
else if(nota >= 85){
printf("Excelente");
}
else if(nota >= 70){
printf("Bien");
}
else if(nota <= 60){
printf("Necesita mejorar");
}

Bucles while
Estructura:

C 21
#include <stdio.h>

void main(){
/*bucle while*/

int i = 10;

while(i >= 0){ // condicion


printf("%d \n",i);
--i; //accion
}
}

Bucle do while
Estructura:

#include <stdio.h>

void main(){
// do while bucle

int num = 1;
do{
printf("%d \n",num);
++num; //accion
}while(num <+= 10); //condicion

Bucle for
Estructura:

#include <stdio.h>

C 22
void main(){
/*code*/
int i, limit = 20;

for (i = 0; i <= limit; i++) // en un for la condicion


se divide en tres partes * variable de inicio * condicion
booleana * accion
{
printf("\nEsto es un for que cuenta: %d",i);

if ( i % 2 == 0)
{
printf("\t Es un numero par");
}

Ejercicio:

// for de tablas para multiplicar


printf("\n\nTablas de multiplicar\n");

for (a = 1; a <= tabla; a++)


{
printf("Tabla del %d",a);

for (j = 0; j <= max; j++)


{
printf("%d\n",a * j);
}
printf("\n");
}

C 23
Ejercicio con continue

#include <stdio.h>

void main()
{
int i;
double suma = 0.0,num;

for(i = 1;i <= 4; i++ ){

printf("Ingrese los numeros_%d: ",i);


scanf("%lf",&num);

if(num < 0){


continue;
}
suma += num;
}
printf("La suma es = %.2lf",suma);
}

Ejercicio con break

#include <stdio.h>

void main()
{
int i;
double suma = 0.0,num;

for(i = 1;i <= 4; i++ ){

printf("Ingrese los numeros_%d: ",i);


scanf("%lf",&num);

C 24
if(num < 0){
break;
}
suma += num;
}
printf("La suma es = %.2lf",suma);
}

Switch

Estructura de un switch (parecido a un if pero usa opciones)

#include <stdio.h>

void main()
{
char calculadora;
double num1,num2;

printf("Elije un simbolo (+,-,*,/): ");


scanf("%c",&calculadora);

printf("Ingrese un numero: ");


scanf("%lf",&num1);
printf("Ingrese un numero: ");
scanf("%lf",&num2);

switch(calculadora){
case '+':
printf("%.2lf + %.2lf = %.2lf ",num1,num2,num1+num2);
break;

case '-':
printf("%.2lf - %.2lf = %.2lf ",num1,num2,num1-num2);
break;

C 25
case '*':
printf("%.2lf * %.2lf = %.2lf ",num1,num2,num1*num2);
break;

case '/':
printf("%.2lf / %.2lf = %.2lf ",num1,num2,num1/num2);
break;

default:
printf("yo dije (+,-,*,/) no esto '%c' pendejo",calcu
break;
}

Prototipo

Definición:
Prototipo: Prototipo se le denomina a la declaración de una
función o procedimiento (un prototipo seria la forma de la
función)

Prototipo ayuda a que el main encuentre la función aunque


esta este debajo de el.
Dentro del prototipo podemos omitir colocarle nombres a las
variables pero dentro de la funcion debemos de colocaselos.

void alv(int,int,int*,int*);//prototipo que omite los nomb


res de las funciones

int main(){

//funcion alv (prototipo declarado con variables sin n

C 26
ombre)
int a = 4,b = 3,sum,mul;
alv(a,b,&sum,&mul);
printf("\nSoy la funcion alv:\nsuma = %d\nmultiplicaci
on = %d",sum,mul);

return 0;
}

void alv(int c, int d, int *e, int *f){// aqui colocamos n


ombre a las variables del prototipo (es obligatorio)
*f = c + d;
*e = c * d;
}

Parámetros formales: son los parámetros que van dentro de la


declaración del prototipo y/o la función. Se llaman formales
porque son los parámetros que forman la estructura de la
función y/o procedimiento(cantidad, tipo y orden de las
variables).

#include <stdio.h>
#include <stdarg.h>

void farewell();//prototipo
//este prototipo no necesita parametros formales porque de
clara un procedimiento

void operacion(int a,int b,int *coc, int *res); //este ser


ia un ejemplo de prototipo con parametros formales.

Parámetros actuales: son los argumentos que va a recibir la


función dentro de su llamada. Se llaman actuales porque
contienen el valor que se utilizara en la función. Los
parámetros actuales deben coincidir con los formales (en
cantidad).

C 27
#include <stdio.h>
int main(){
int num1 = 12,num2 = 4,coc,res;
operacion(num1,num2,&coc,&res);
//dentro de la funcion tenemos nuestros punteros y ell
os apunta (mediante indireccion) a las variables locales c
readas dentro del main.
printf("El cosciente es %d\nLa resta es %d",coc,res);

return 0;
}

Funciones

Detalles:
Las funciones retornan un único valor

Si no retorna un valor —> no es una función.

Si retorna varios —> no es una función.

C 28
Prototipo —> se traduce a declarar la función al estilo C.
llamar la función (esta demás explicar).
Definir y por ultimo retornar.

#include <stdio.h>

int calculadora(int a,int b);//prototipo de la funcion

void main(){
/*code*/
int num1,num2,resp;

printf("Elige dos numeros: ");


scanf("%d %d",&num1,&num2);

resp = calculadora(num1,num2); // llamar la funcion


printf("la suma es = %d",resp);

}
int calculadora(int a,int b){ // cuerpo de la funcion
int result;

result = a + b;

return result; // retorn


}

Hay varias maneras de crear funciones y llamarlas.


el primer ejemplo usa int para declarar la función el
siguiente usa void el cual autollama la funcion.

#include <stdio.h>
//(funciones para usuarios)

C 29
void primos();
void main(){
int num1,num2,resp;
// esta es otra forma de hacer funciones (funciones para u
suarios)
primos();
}
void primos(){ // las funciones con void se autollaman
int i,n,flag = 0;

printf("Escriba un numero: ");


scanf("%d",&n);

for(i = 2; i < n/2;i++){


if (n % i == 0)
{
flag = 1;
}
}
if (flag == 1)
{
printf("%d No es un primo",n);
}
else{
printf("%d Es un primo",n);
}
}

Esta es otra forma de declarar funciones:

#include <stdio.h>

int suma(int n1, int n2){


int resultado;

resultado = n1 + n2;

C 30
return resultado;
}
void main(){
int a,b,c;

printf("Ingrese un dato: ");


scanf("%d",&a);

printf("Ingrese un dato: ");


scanf("%d",&b);

c = suma(a,b);

printf("El resultado es: %d",c);

Parámetro REST (permite que una variable tenga varios


valores)

#include <stdio.h>
#include <stdarg.h>

void gretting(){
printf("Holaaa, bienvenido a C\n");
}

//void op(int a,int b,int *coc, int *res){}

void valores(int a,...){


va_list argList;//delcara var tipo lista
va_start (argList, a); //los valores de a pasan a la l
ista

for(int i = 0; i < a; i++){//bucle que recorre la list


a

C 31
int fredo = va_arg(argList, int);//var que recibe
los valores (especificando su tipo de danto en el segundo
parametro)
printf("%d\n", fredo);//imprimir
}
va_end(argList);//finaliza la lista

int main(){
gretting();
valores(3, 1, 2, 9);

return 0;
}

Procedimientos
Un procedimiento es un grupo de sentencias que realizan una
tarea concreta.Puede devolver cero o mas valores en sus
parametros.

C 32
Los procedimientos en C no son funciones ya que pueden o no
retornar nada (porque se declaran con void) o pueden declarar
varios valores…es bueno saber cuando usar una funcion o un
procedimiento ya que no es lo mismo hacer una funcion que
retorne y un procedimiento que no

#include <stdio.h>

void gretting(){
printf("Holaaa, bienvenido a C");
}//procedimiento

int main(){
gretting();

return 0;
}

#include <stdio.h>

void operaciones(int a,int b,int *coc,int *res)/*(el decla


rar las variables de retorno como punteros se llama:) Pasa
je de parametros por referencia*/{

}//procedimiento

int main(){
gretting();

return 0;
}

Recursión

C 33
Recursión o recursividad es como se le dice a la técnica de
una función llamándose a si misma.
Este termino es muy utilizado en estructuras de datos y
algoritmos.

#include <stdio.h>

int suma(int n);


void main(){
int numero,respuesta;

printf("Ingrese un numero: ");


scanf("%d",&numero);

respuesta = suma(numero);

printf("La suma es = %d",respuesta);


}
int suma(int n){
if (n != 0)
{
return n + suma(n-1);//recursividad
}
}

Array
Los arrays son variables estructuradas, donde cada elemento
se almacena de forma consecutiva en memoria
. Las cadenas de caracteres son declaradas en C como arrays
de caracteres y permiten la utilización de un cierto número
de notaciones y de funciones especiales.
Ejemplo de un array de numeros:

C 34
#include <stdio.h>

int main()
{
int numeros [4];

printf("Ingrese 4 numeros: ");


for(int i = 0; i < 4; i++){
scanf("%d",&numeros[i]);
}

printf("Mostrando numeros");
for(int i = 0; i < 4; i++){
printf("| %d |",numeros[i]);
}

return 0;
}

Ejercicio promedio:

int main()
{
int numeros[8],i,n,sum,pro;

printf("Valores limites: ");


scanf("%d",&n);

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


printf("Ingrese el valor %d: ", i+1);
scanf("%d",&numeros[i]);
sum += numeros[i];
}
pro = sum/n;
printf("El promedio es: %d",pro);

C 35
return 0;
}

si no se restringe es muy probable que el usuario agrega


datos mas alla del valor permitido en el array

#include <stdio.h>

int main()
{
char numeros[] = {1,2,3,4,5};

for(int i = 0; i < sizeof(numeros); i++){

printf(" %d ", numeros[i]);


}
return 0;
}

Matrices
Un array en C
puede tener una, dos o más dimensiones. Por ejmplo, un array
de dos dimensiones también denominado
matriz
, es interpretado como un array (umidimensional) de dimensión
"f" (número de filas), donde cada componente es un array
(unidimensional) de dimensión "
c
" (número de columnas).

C 36
#include <stdio.h>
const int ciudad = 2;
const int semana = 7;

int main()
{
int coronavirus[ciudad][semana];

for(int i = 0; i < ciudad; i++){


for(int j = 0; j < semana;j++){
printf("Ciudad %d, dia %d : ",i+1,j+1);
scanf("%d",&coronavirus[i][j]);
}
}

printf("\nDatos: \n\n");
for(int i = 0; i < ciudad;i++){
for(int j = 0; j < semana; j++){
printf("Ciudad %d, dia %d : %d \n",i+1,j+1,corona

C 37
}
}
return 0;
}

#include <stdio.h>

void main(){
/*code*/
int sum[2][2],a[2][2],b[2][2];

printf("Suma de matrices\n");
for (int i = 0; i < 2; i++)//valores matriz a
{
for (int j = 0; j < 2; j++)
{
printf("Ingrese el numero a%d_%d ",i+1,j+1);
scanf("%d",&a[i][j]);

for (int i = 0; i < 2; i++)//valores matriz b


{
for (int j = 0; j < 2; j++)
{
printf("Ingrese el numero b%d_%d ",i+1,j+1);
scanf("%d",&b[i][j]);

C 38
//suma de las matrices
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
sum[i][j] = a[i][j] + b[i][j];

//result
printf("La suma de la matriz a y b es: \n");
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
printf("%d ",sum[i][j]);
if (j == 1)
{
printf("\n");
}

Datos Avanzados:
Directivas de procesador

Las directivas de procesador no son sentencias en C, por


lo tanto no llevan ;.

C 39
1. El procesador es el primer programa que se ejecuta al
empezar a compilar.

2. Las directivas no son sentencias en C.

3. Sirven para dar instrucciones al compilador.

4. Todas las directivas de procesador empiezan con #

5. Las directivas mas utilizadas son: #include y #define

Include

Si queremos incluir archivos que vienen por defecto en el


compilador de C <usamos esto> si queremos incluir
librerias propias “usamos estas”:

1. La directiva #include sirve para incluir en nuestro


programa librerías o código externo.

2. Código externo desarrollado por otro programador que puedo


utilizar en mi programa.

#include <nombre_archivo>
#include “nombre_archivo”

Define

Define se utiliza en la definición de valores constante (C


da error si llamamos una variable igual que un macro)

C 40
Estructuras de control
Existen dos tipos de sentencias:

Sentencias simples: son las que finalizan con ;.

Por ejemplo: printf(”Hola Mundo”);

Sentencias compuestas: Conjunto de sentencias simples


encerradas entre llaves.

Por ejemplo: { sentencia1; sentencia2; }

Modularización
Dividir un codigo extenso en varios modulos

Ámbito

Repaso
Las variables tienen 6 atributos:

Nombre

Valor

Tipo

C 41
Dirección

Tiempo de vida

Ámbito

Ámbito:
todo identificador tiene un campo de acción y solo dentro de
este podrá realizar su trabajo.

Estos se clasifican en cuatro:

1. Ámbito de Programa

a. Son variables que son reconocidas por todo el programa


(globales)

2. “” de Archivo

a. Contrario al ámbito de programa las de archivo solo se


pueden utilizar dentro del archivo.

3. “” de Función

a. Son variables que son reconocidas solo por esa funcion


(Locales)

4. “” de Bloque

Modificadores de ambito:
Todos estos modificadores se colocan delante de la variable
al declararla.
modificador tipo de dato name variable

auto —> viene por defecto este se crea conjunto a nuestra


variable y muere cuando la función en la que se uso
muere(se deja de usar).

extern —> Con extern le decimos al programa que la


variable ya existe en otro archivo y que debe buscarla

C 42
fuera.

static —> la variable no muere sino que se mantiene con


vida aun si el labor de su función acabo (su valor se
mantiene).

register —> guarda las variables en lugares de memoria


específicos y no en la memoria RAM de nuestra pc.

No se recomienda su uso porque puede venir con problemas


laterales (cambio de datos o valores no deseados).

C 43
Declaración de variables:
Globales
son variables que se declaran fuera de cualquier función.

#include <stdio.h>

int numero = 12;//variable global

void main(){

printf("ejemplo");
}

Locales
son variables que se declaran dentro de cualquier bloque
(for,if,switch,while..etc).

#include <stdio.h>

void main(){
if (10 > 5){

C 44
char text[] = "True"; // variable local
printf("%s",text);
}else{
char text[] = "Falso"; // variable local
printf("%s",text);
}
}

Pasaje de parámetros por valor y por referencia

Pasaje de parámetros por valor: ocurre cuando pasamos


argumentos a una función que recibe valores. Se llama Pasaje
de parámetros por valor porque los valores de las variables
(que se pasan como argumentos) mantienen sus valores mientras
que dentro de la función los parámetros toman sus valores
(los copian) y pueden cambiar sin afectar las variables
originales.

#include <stdio.h>
#include <stdarg.h>

void operacion(int a,int b,int *coc, int *res){ // a y b


son variable Pasaje de parámetros por valor
*coc = a / b;
*res = a - b;
}

int main(){

int num1 = 12,num2 = 4,coc,res;


operacion(num1,num2,&coc,&res);//num1 y num2 son los
argumentos a los que la funcion les copiara sus valores

printf("El cosciente es %d\nLa resta es %d",coc,re


s);

C 45
return 0;
}

(OJO: Pasaje de parámetros por referencia no existe como tal


siempre se pasa por valores, pero con los punteros podemos
referirnos a que variable pasar los valores ).
Pasaje de parámetros por referencia: ocurre cuando pasamos
como argumentos de una función las direcciones en memoria de
nuestros argumentos. Se llama Pasaje de parámetros por
referencia porque nos referimos a las direcciones en memoria
de una variable.
Dentro de nuestra función y/o prototipo declaramos las
variables de tipo punteros las cuales reciben como argumentos
los direcciones en memoria de las variables dentro del main.
Al hacer esto nuestros valores y/o resultados se guardan
dentro de las variables del main.

#include <stdio.h>
#include <stdarg.h>

void operacion(int a,int b,int *coc, int *res){ // *coc


y *res son variable de tipo puntero ( Pasaje de parámetr
os por referencia)
*coc = a / b;
*res = a - b;
}

int main(){

int num1 = 12,num2 = 4,coc,res;


operacion(num1,num2,&coc,&res);//&coc y &res son los
argumentos a los que la funcion les copiara sus direccio
nes de memoria

C 46
printf("El cosciente es %d\nLa resta es %d",coc,re
s);

return 0;
}

Como se diferencia uno de otro?


Los parámetros por valor son declarados como variables
normales los de parámetros por referencia como variables de
tipo puntero.

Plus Software Security


Vuris total analiza archivos o url

Expandurl te muestra con detalle a donde van url cortas

Recursos adicionales:

https://youtu.be/7KZ5LCFr6Sw

Canal de Youtube con curso de C completos

Facu Darfe
Soy Técnico Universitario en Programación,
apasionado por la informática, la tecnología y el
desarrollo de sistemas en general. Trato de
https://www.youtube.com/@facudarfe

Primer Curso de C que tome

C 47
https://www.youtube.com/watch?v=wk930KiQJU8&list=PLg9145ptu
Aig7vzvLMYBssAzSjhnGaRmQ

From an exam

#include <string.h>

int foo(void) {
char bar[128];
char *baz = &bar[0];
baz[127] = 0;
return strlen(baz);
}

char blah[] = "fizzbuzz";


printf("%s\n", blah+4);

//CHECk
/*
¿Cuáles de los siguientes son verdaderos de la memoria devuel
ta a través de la función malloc? Marque todo lo que correspo
nda.
*/

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

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


unsigned int i;
unsigned int k = atoi(argv[1]);
char *buf = malloc(k); /* 1 */
if(buf == 0) {

C 48
return -1;
}

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


buf[i] = argv[2][i]; /* 2 */
}

printf("%s\n", buf); /* 3 */

return -1;
}

//CHECK
/*
¿Cuáles de las siguientes son afirmaciones verdaderas sobre e
l program stacks?
*/

//CHECK
/*
Which of the following are true of the X86 call instruction?
¿Cuáles de los siguientes son verdaderos de la instrucción de
llamada X86?
*/

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

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


int **blah2 = malloc(sizeof(int*)*N);
int *special = NULL;
int i, j;

C 49
for(i = 0; i < N; i++) {
int *tmp = (int *)malloc(sizeof(int)*M);
memset((void *)tmp, 0, sizeof(int)*M);
if(i > N) {
special = &tmp[3];
}
blah2[i] = tmp;
}

if(special != NULL) {
*special = 7;
}

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


for(j = 0; j < M; j++) {
printf("%d ", blah2[i][j]);
}
printf("\n");
}

return 0;
}

C 50

También podría gustarte