Elección DR y BDR en OSPF

Cuando varios routers estan conectados a un segmento de red del tipo broadcast (como las redes Ethernet), uno de estos routers del segmento tomará el control y mantendrá las adyacencias entre todos los routers de ese segmento. Ese router toma el nombre de DR (Designated Router) y será elegido a través de la información que contienen los mensajes hello que se intercambian los routers. Para una eficaz redundancia también se elige un router designado de reserva ó BDR. Los DR son creados en enlaces multiacceso debido a que el número de adyacencias incrementaría de manera significativa el tráfico de la red, de esta forma el DR y el BDR terminan reduciendo la cantidad de las mismas y optimizando el ancho de banda y los recursos de hardware de los routers.
En el caso de no tener DR BDR la cantidad de adyacencias que se establecerian en una topología como la de la figura se refleja en la fórmula:
Entonces, si tenemos por ejemplo 4 routers la cantidad de adyacencias sin DR BDR serian:
Esta forma de añadir adyacencias consumiría gran cantidad de ancho de banda, recursos de memoria y CPU de los routers. El propósito de este método es reducir al máximo este consumo de recursos haciendo que todos los demás routers establezcan adyacencias con el. Entonces, utilizando el sistema anteriormente mencionado la cantidad de adyacencias en redes multiacceso se limita a:
El DR recibe actualizaciones y las distribuye a todos los demás routers del segmento asegurándose con acuses de recibo (ack´s) de que éstos han recibido correctamente dichas actualizaciones y poseen una copia sincronizada de la LSDB. Los routers notifican los cambios a través de la direccion multicast 224.0.0.6 a su vez el DR envía las LSA a los routers por la direccion 224.0.0.5. El BDR escucha pasivamente y mantiene una tabla de relación con todos los demás routers, en el caso de que el DR deje de enviar hello el BDR tomará el papel del DR.
Hacemos a continuación una obvia demostración de que el número de adyancias disminuye con el DR y BDR usando el método de inducción:
:wq!

Archivos

Dejo los 2 primeros ejercicios de la sección de Manejo de Archivos resueltos y el primero de matrices.
Ej 1


#include “stdio.h”

void ingresarDatos(int a[], int tam){
int i=0;
int aux=0;

for(i=0; i<=tam; i++){ printf("Ingrese un valor para el arreglo: "); scanf("%d", &aux); a[i]=aux; } } void initVector(int vec[], int tam){ int i=0; for(i=0;i<=tam;i++){ vec[i] = 0; } } void showVector(int vec[], int tam){ int i=0; for(i=0;i<=tam;i++){ printf("El vector tiene en la posicion %d: %d\n", i, vec[i]); } } int main(){ FILE *fp; int leer[10]; int escribir[10]; int i=0; char nombre[20] = "enteros.dat"; initVector(leer,10); initVector(escribir,10); //showVector(leer,10); ingresarDatos(escribir,10); if(fp = fopen(nombre,"w+")){ printf("archivo abierto correctamente!\n\n"); //Escribir datos en el archivo... if(fwrite(escribir,sizeof(int),10,fp)){ printf("\nArchivos escritos exitosamente!\n\n"); }else{printf("\nHubo un problema al escrbir los archivos!\n\n");} //Ponemos el puntero al principio del archivo rewind(fp); //Leemos los archivos if(fread(leer,sizeof(int),10,fp)){ printf("\nLectura exitosa!\n\n"); }else{printf("Error al leer los datos!");} }else{ printf("Problemas al abrir el archivo!"); } //Mostramos los datos leidos showVector(leer,10); } [/c] Ej 2 [c] #include "stdio.h" void ingresarDatos(float a[], int tam){ int i=0; float aux=0; for(i=0; i<=tam; i++){ printf("Ingrese un valor para el arreglo: "); scanf("%f", &aux); a[i]=aux; } } void initVector(float vec[], int tam){ int i=0; for(i=0;i<=tam;i++){ vec[i] = 0; } } void showVector(float vec[], int tam){ int i=0; for(i=0;i<=tam;i++){ printf("El vector tiene en la posicion %d: %f\n", i, vec[i]); } } int main(){ FILE *fp; float leer[10]; float escribir[10]; int i=0; char nombre[20] = "reales.dat"; initVector(leer,10); initVector(escribir,10); //showVector(leer,10); ingresarDatos(escribir,10); if(fp = fopen(nombre,"w+")){ printf("archivo abierto correctamente!\n\n"); //Escribir datos en el archivo... if(fwrite(escribir,sizeof(float),10,fp)){ printf("\nArchivos escritos exitosamente!\n\n"); }else{printf("\nHubo un problema al escrbir los archivos!\n\n");} //Ponemos el puntero al principio del archivo rewind(fp); //Leemos los archivos if(fread(leer,sizeof(float),10,fp)){ printf("\nLectura exitosa!\n\n"); }else{printf("Error al leer los datos!");} }else{ printf("Problemas al abrir el archivo!"); } //Mostramos los datos leidos showVector(leer,10); fclose(fp); } [/c] Ej 6.1 Matrices [c] #include "stdio.h" void ingresarDatos(int a[5][5], int tam){ int i=0; int j=0; int aux=0; for(i=0; i<=tam; i++){ for(j=0; j<=tam; j++){ printf("Ingrese un valor para el arreglo[%d][%d]: ",i,j); scanf("%d", &aux); a[i][j]=aux; } } } void initVector(int vec[5][5], int tam){ int i=0; int j=0; for(i=0;i<=tam;i++){ for(j=0; j<=tam; j++){ vec[i][j] = 0; }} } void showVector(int vec[5][5], int tam){ int i=0; int j=0; for(i=0;i<=tam;i++) for(j=0;j<=tam;j++){ { printf("MAT[%d][%d]: %d\n", i,j, vec[i][j]); } } } int main(){ FILE *fp; int leer[5][5]; int escribir[5][5]; int i=0; char nombre[20] = "matriz.dat"; initVector(leer,5); initVector(escribir,5); //showVector(leer,5); ingresarDatos(escribir,5); if(fp = fopen(nombre,"w+")){ printf("archivo abierto correctamente!\n\n"); //Escribir datos en el archivo... if(fwrite(escribir,sizeof(int[5]),5,fp)){ printf("\nArchivos escritos exitosamente!\n\n"); }else{printf("\nHubo un problema al escrbir los archivos!\n\n");} //Ponemos el puntero al principio del archivo rewind(fp); //Leemos los archivos if(fread(leer,sizeof(int[5]),5,fp)){ printf("\nLectura exitosa!\n\n"); }else{printf("Error al leer los datos!");} }else{ printf("Problemas al abrir el archivo!"); } //Mostramos los datos leidos showVector(leer,5); fclose(fp); } [/c] return 0;

Ejercicios C – Informática

1. a)

#include
//Ejercicio 1 - Informatica - UNSAM
int main(void){
printf("Hello World!!!!!");
}

b)

#include "stdio.h"
//Ejercicio 2 - Informatica - UNSAM
void ingresarDatos(int &a, int &b){
printf("Ingrese la altura del rectangulo: ");
scanf("%d", &a);
printf("Ingrese la base del rectangulo: ");
scanf("%d", &b);
}

int calcularSuperficie(int altura, int base){
int sup=0;
sup = base*altura;

return sup;
}

void menu(int &base, int &altura){
char opc;
while(opc!='3'){
printf("\n1- Ingresar datos");
printf("\n2- Calcular superficie");
printf("\n3- Salir\n");
scanf("%c",&opc);

if(opc=='1'){
ingresarDatos(base,altura);
printf("\nDatos ingresados correctamente!");
}else if(opc=='2'){
printf("\nLa superficie del rectangulo es: %d", calcularSuperficie(base,altura));
}else if(opc=='3'){

}else{
printf("\nOpcion Incorrecta!");
}
}
}

//procedimiento principal
int main(void){
//variables
int base=0;
int altura=0;

menu(base, altura);
}

c)

#include "stdio.h"
//Ejercicio 3 - Informatica - UNSAM
//Constantes
#define PI 3.14;

void ingresarDatos(int &a){
printf("Ingrese el radio de la circunferencia: ");
scanf("%d", &a);
}

float calcularSuperficie(int radio){
float sup;
float pi = PI;

sup = float(radio)*float(radio)*pi;

return sup;
}

float calcularPerimetro(int radio){
float perimetro = 0;
float pi = PI;

perimetro = 2*pi*radio;

return perimetro;
}

void menu(int &radio){
char opc;
while(opc!='4'){
printf("\n1- Ingresar datos");
printf("\n2- Calcular superficie");
printf("\n3- Calcular perimetro");
printf("\n4- Salir\n");
scanf("%c",&opc);

if(opc=='1'){
ingresarDatos(radio);
printf("\nDatos ingresados correctamente!");
}else if(opc=='2'){
printf("\nLa superficie de la circunferencia es: %f", calcularSuperficie(radio));
}else if(opc=='3'){
printf("\nEl perimetro de la circunferencia es: %f", calcularPerimetro(radio));
}else if(opc=='4'){
printf("Bye!");
}else{
printf("\nOpcion Incorrecta!");
}
}
}

//procedimiento principal
int main(void){
//variables
int radio=0;

menu(radio);
}

d)

#include
//Ejercicio 4 - Informatica - UNSAM
void ingresarDatos(int &a, int &b, int &c){
printf("Ingrese un numero: ");
scanf("%d", &a);
printf("Ingrese otro numero: ");
scanf("%d", &b);
printf("Ingrese otro numero: ");
scanf("%d", &c);
}

int suma(int a,int b,int c){
int suma=0;
suma = a+b+c;

return suma;
}

void menu(int &a,int &b,int &c){
char opc;
while(opc!='3'){
printf("\n1- Ingresar datos");
printf("\n2- Calcular suma");
printf("\n3- Salir\n");
scanf("%c",&opc);

if(opc=='1'){
ingresarDatos(a,b,c);
printf("\nDatos ingresados correctamente!");
}else if(opc=='2'){
printf("\nLa suma es: %d", suma(a,b,c));
}else if(opc=='3'){

}else{
printf("\nOpcion Incorrecta!");
}
}
}

int main(void){
int a=0;
int b=0;
int c=0;

menu(a,b,c);
}

2. a)

#include
//Ejercicio 5 - Informatica - UNSAM

int main(void){
int a=0;
int b=0;

printf("Ingrese un valor: ");
scanf("%d",&a);
printf("Ingrese un valor: ");
scanf("%d",&b);

if(aprintf("Resultado: %d",a*b);
}else{
if(b!=0){
printf("Resultado: %d", a/b);
}else{
printf("No se puede dividir por 0!");
}
}
}

b)

#include
//Ejercicio 6 - Informatica - UNSAM

//Constantes
#define PI 3.14

void ingresarDatos(int &base, int &altura, int &radio){
printf("Ingrese la base: ");
scanf("%d",&base);

printf("Ingrese la altura: ");
scanf("%d",&altura);

printf("Ingrese el radio: ");
scanf("%d",&radio);
}

float superficieCircunferencia(int radio){
float sup;
float pi = PI;

sup = float(radio)*float(radio)*pi;

return sup;
}

float superficieTriangulo(int base, int altura){
int sup=0;
sup = (base*altura)/2;

return sup;
}

char compararSuperficies(int base,int altura,int radio){
char a;

if(superficieTriangulo(base,altura)a='c';
}else if(superficieTriangulo(base,altura)>superficieCircunferencia(radio)){
a='t';
}else{
a='i';
}

return a;
}

void menu(int &base, int &altura, int &radio){
char opc;
while(opc!='3'){
printf("\n1- Ingresar datos");
printf("\n2- Comparar superficies");
printf("\n3- Salir\n");
scanf("%c",&opc);

if(opc=='1'){
ingresarDatos(base,altura,radio);
printf("\nDatos ingresados correctamente!");
}else if(opc=='2'){
if(compararSuperficies(base,altura,radio)=='i'){
printf("Las superficies son iguales!");
}else if(compararSuperficies(base,altura,radio)=='t'){
printf("La superficie del triangulo es mayor!");
}else{
printf("La superficie de la circunferencia es mayor!");
}
}else if(opc=='3'){

}else{
printf("\nOpcion Incorrecta!");
}
}
}

//Porgrama principal
int main(void){
int radio=0;
int altura=0;
int base=0;

menu(base, altura, radio);
}

c)

#include
//Ejercicio 7 - Informatica - UNSAM

void ingresarDatos(int &a){
printf("Ingrese un valor: (7 para salir)");
scanf("%d", &a);
}
//Se utiliza un tipo de dato integer debiado a que en C no existe el tipo booleano
int esMultiplo(int &a){
if((a%7)==0){return 1;}else{return 0;}
}

int main(void){
int valor=0;

while(valor!=7){
ingresarDatos(valor);
if(esMultiplo(valor)== 1){ printf("El valor ingresado es multiplo de 7!\n");
}else{ printf("El valor ingresado NO es multiplo de 7!!\n"); }
}
}

e)

#include
//Ejercicio 9 - Informatica - UNSAM

void ingresarDatos(int a[], int tam){
int i=0;
int aux=0;

for(i=1; iprintf("Ingrese un valor para el arreglo: ");
scanf("%d", &aux);
a[i]=aux;
}
}

float promedio(int a[], int tam){
int i=0;
int suma=0;
float promedio=0;

for(i=1;isuma = suma + a[i];
printf("\n%d",suma);
}
printf("\n%d",suma);
printf("\n%d",tam);
promedio= float(suma)/tam;
return promedio;
}

void showVector(int a[], int tam){
int i=0;

for(i=1;iprintf("\n El valor de la posicion %d del vector es: %d", i, a[i]);
}
}

int main(void){
int vector[10];

ingresarDatos(vector,10);
showVector(vector,10);

printf("El promedio es de: %f", promedio(vector,10));

}

f)

#include
//Ejercicio 10 - Informatica - UNSAM

void ingresarDatos(int a[], int tam){
int i=0;
int aux=0;

for(i=1; iprintf("Ingrese un valor para el arreglo: ");
scanf("%d", &aux);
a[i]=aux;
}
}

int maximo(int a[], int tam){
int i=0;
int aux=0;

aux=a[1];

for(i=1;iif(auxaux = a[i];
}
}

return aux;
}

void showVector(int a[], int tam){
int i=0;

for(i=1;iprintf("\n El valor de la posicion %d del vector es: %d", i, a[i]);
}
}

int main(void){
int vector[10];

ingresarDatos(vector,10);
showVector(vector,10);
printf("\nEl valor maximo es: %d",maximo(vector,10));

}

g)

#include
//Ejercicio 11 - Informatica - UNSAM

int productoria(int a[], int cant){
int i=0;
int productoria=1;

for(i=1;iproductoria = productoria * a[i];
}

return productoria;
}

void initVector(int a[], int tam){
int i=0;

for(i=1;ia[i]=0;
}
}

void ingresarDatos(int a[], int tam, int &cant){
int i=1;
int valor=0;

while(valor>=0 && iprintf("\nIngrese un valor: ");
scanf("%d", &valor);
a[i] = valor;
i++;
}

cant = i-2;
}

void showVector(int a[], int tam){
int i=0;

for(i=1;iprintf("\n El valor de la posicion %d del vector es: %d", i, a[i]);
}
}

int main(void){
int cant=0;
int tam=50;
int vector[50];

initVector(vector,tam);
showVector(vector,tam);

ingresarDatos(vector,tam,cant);

printf("La productoria es: %d y la cantidad de valores ingresador es de: %d",productoria(vector,cant),cant);

}

Ej 6-2 a 6-3


#include “stdio.h”

void menu(){

}

int sumaDiagSec(int a[5][5], int tam){
int i=0;
int j=0;
int suma = 0;

for(i=0; i