Você está na página 1de 7

Índice de Contenidos I

Índice de Contenidos
1. Problema 1 1

2. Problema 2 3
2.1. Programe un código que detecte si una relación R con la representación es cuasi-orden. 3
2.2. Demuestre que si R es cuasi-orden entonces la mayor relación de equivalencia conte-
nida dentro de esta es R ∩ R1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.3. Programe un código que devuelva la mayor relación de equivalencia que esta contenida
en una relación que es cuasi-orden. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

3. Problema 3 5

4. Problema 4 5
4.1. Considere un tablero de ajedrez de tamaño 2n x2n . Demuestre que ∀n ≥ 2, se pueden
poner a lo más 22n−1 caballos sin que se “coman” entre sí. . . . . . . . . . . . . . . . 5
4.2. Programe una función que, dado n, muestre en una matriz (1 donde hay caballos, 0
donde no) una posible forma de poner 22n−1 caballos en el tablero. . . . . . . . . . . 5

Lista de Figuras

Lista de Tablas

Tarea 1 CC3101-1 Matemáticas Discretas


1 Problema 1 1

1. Problema 1
Sea V el conjunto de nombres de variable, C el conjunto de constantes numéricas y (,) el con-
junto de paréntesis. Definiremos inductivamente el conjunto ARIT de todas las posibles expresiones
aritméticas que usan las operaciones de suma y multiplicación de la siguiente manera:

(a) Cada constante numérica en C pertenecen a ARIT.


(b) Cada variable en V pertenece a ARIT.
(c) Si e pertenece a ARIT, entonces (e) pertenece a ARIT.
(d) Si a y b pertenecen a ARIT, entonces a + b pertenece a ARIT.
(e) Si a y b pertenecen a ARIT, entonces ab pertenece a ARIT.

Programe un cédigo que dado una secuencia de caracteres diga si es una expresión aritmética
del conjunto ARIT o no. En caso de que la respuesta sea afirmativa, muestre una sucesión de reglas
de la definición inductiva de ARIT que formen la expresión dada.
1 int main ( int argc , char ∗ argv [ ] ) {
2 while ( c i n ) {
3 s t r i n g exp ;
4 g e t l i n e ( c i n , exp ) ;
5 char r e s p [ exp . s i z e ( ) ] ;
6 s t r i n g prev=" " ;
7 int paren =0;
8 int i =0, j =0;
9 b o o l f l a g=t r u e ;
10 while ( i <exp . s i z e ( ) ) {
11 i f ( i s d i g i t ( exp [ i ] ) ) {
12 i f ( ! prev . compare ( " number " ) \
13 | | ! prev . compare ( " v a r i a b l e " ) ) {
14 f l a g=f a l s e ;
15 break ;
16 }
17 while ( i s d i g i t ( exp [ i ] ) ) i ++;
18 r e s p [ j ]= ’ a ’ ;
19 prev=" number " ;
20 }
21 e l s e i f ( exp [ i ]== ’ ( ’ | | exp [ i ]== ’ ) ’ ) {
22 i f ( exp [ i ]== ’ ( ’ ) {
23 paren++;
24 i f ( ! prev . compare ( " number " ) \
25 | | ! prev . compare ( " v a r i a b l e " ) ) {
26 f l a g=f a l s e ;
27 break ;
28 }
29 j −−;
30 }
31 i f ( exp [ i ]== ’ ) ’ ) {

Tarea 1 CC3101-1 Matemáticas Discretas


1 Problema 1 2

32 paren −−;
33 i f ( ! prev . compare ( " op " ) ) {
34 f l a g=f a l s e ;
35 break ;
36 }
37 r e s p [ j ]= ’ c ’ ;
38 }
39 prev=" paren " ;
40 i ++;
41 i f ( paren <0){
42 f l a g=f a l s e ;
43 break ;
44 }
45 }
46 e l s e i f ( exp [ i ]== ’+ ’ | | exp [ i ]== ’ ∗ ’ ) {
47 i f ( ! prev . compare ( " op " ) \
48 | | ! prev . compare ( " " ) | | exp [ i −1]== ’ ( ’ ) {
49 f l a g=f a l s e ;
50 break ;
51 }
52 i f ( exp [ i ]== ’+ ’ ) {
53 r e s p [ j ]= ’ d ’ ;
54 }
55 i f ( exp [ i ]== ’ ∗ ’ ) {
56 r e s p [ j ]= ’ e ’ ;
57 }
58 prev=" op " ;
59 i ++;
60 }
61 else {
62 i f ( ! prev . compare ( " number " ) \
63 | | ! prev . compare ( " v a r i a b l e " ) ) {
64 f l a g=f a l s e ;
65 break ;
66 }
67 r e s p [ j ]= ’ b ’ ;
68 prev=" v a r i a b l e " ;
69 i ++;
70 }
71 j ++;
72 }
73 i f ( ! f l a g | | paren ! = 0 | | ! prev . compare ( " op " ) ) {
74 cout<<"NO"<<e n d l ;
75 }
76 else {
77 for ( int k=0;k<j −1;k++){

Tarea 1 CC3101-1 Matemáticas Discretas


2 Problema 2 3

78 cout<<r e s p [ k]<< ’ , ’ ;
79 }
80 cout<<r e s p [ j −1]<<e n d l ;
81 }
82 }
83 }
Lista de Códigos Fuente 1: Ejercicio 1) en C++

2. Problema 2
Para representar una relación R sobre un conjunto finito A = a1 , .., an utilizamos una matriz
indicatriz, es decir, una matriz de nn tal que Aij = 1 si y solo si (ai , aj ) está en R. Una relación R
en A es cuasi-orden si es refleja y transitiva.

2.1. Programe un código que detecte si una relación R con la re-


presentación es cuasi-orden.
En el código primero se arma una matriz sin los espacios entre medio, luego se comprueba que
es refleja y por último se comprueba la transitividad.
1 #include <b i t s / s t d c ++.h>
2 u s i n g namespace s t d ;
3
4 int main ( int argc , char ∗ argv [ ] ) {
5 string linea ;
6 g e t l i n e ( cin , l i n e a ) ;
7 int columnas=l i n e a . s i z e ( ) ;
8 int n=(columnas +1) / 2 ;
9 char aux [ n ] [ columnas + 1 ] ;
10 char m a t r i z [ n ] [ n ] ;
11 s t r c p y ( aux [ 0 ] , l i n e a . c _ s t r ( ) ) ;
12 for ( int i = 1 ; i < n ; i ++) {
13 g e t l i n e ( cin , l i n e a ) ;
14 s t r c p y ( aux [ i ] , l i n e a . c _ s t r ( ) ) ;
15 }
16 int x=0;
17 for ( int k=0; k<n ; k++){
18 x=0;
19 for ( int l =0; l <columnas ; l ++){
20 i f ( aux [ k ] [ l ] ! = ’ ’ ) {
21 m a t r i z [ k ] [ x]= aux [ k ] [ l ] ;
22 x++;
23 }
24 }
25 }

Tarea 1 CC3101-1 Matemáticas Discretas


2 Problema 2 4

26 int i =0, j =0,nn=0;


27 b o o l f l a g=t r u e ;
28 while ( i <n && f l a g ) {
29 i f ( m a t r i z [ i ] [ i ] ! = ’ 1 ’ ) f l a g=f a l s e ;
30 i ++;
31 }
32 for ( int k=0;k<n ; k++){
33 for ( int l =0; l <n ; l ++){
34 i f ( m a t r i z [ k ] [ l ]== ’ 1 ’&& k!= l ) {
35 f o r ( int m=0;m<n ;m++){
36 i f ( m a t r i z [ l ] [m]== ’ 1 ’ \
37 && m a t r i z [ k ] [m] ! = ’ 1 ’ ) {
38 f l a g=f a l s e ;
39 }
40 }
41 }
42 }
43 }
44 i f ( f l a g ) cout<< ’ 1 ’<<e n d l ;
45 e l s e cout<< ’ 0 ’<<e n d l ;
46 }
Lista de Códigos Fuente 2: Ejercicio 2)a) en C++

2.2. Demuestre que si R es cuasi-orden entonces la mayor relación


de equivalencia contenida dentro de esta es R ∩ R1 .
Ya que la propiedad que falta para ser una relación de equivalencia es la simetría, para que esta
se cumpla tanto aRb como bRa ∀a, b, es decir debe cumplirse R y R−1 (R ∩ R1 ). Es la mayor debido
a que no se elimina ningún elemento que cumpla con la simetría sino que solo los que no podrían
cumplirla mientras sea la misma relación.

2.3. Programe un código que devuelva la mayor relación de equiva-


lencia que esta contenida en una relación que es cuasi-orden.
Como en la parte anterior se dice que la mayor relación de equivalencia contenida en una R
cuasi-ordenada es R ∩ R−1 , el código encontrara la matriz indicatriz que representa esa intersección.
1 #include <b i t s / s t d c ++.h>
2 using namespace s t d ;
3
4 int main ( ) {
5 string linea ;
6 g e t l i n e ( cin , l i n e a ) ;
7 int columnas=l i n e a . s i z e ( ) ;
8 int n=(columnas +1) / 2 ;
9 char m a t r i z [ n ] [ columnas + 1 ] ;

Tarea 1 CC3101-1 Matemáticas Discretas


4 Problema 4 5

10 char r e s p [ n ] [ columnas + 1 ] ;
11 strcpy ( matriz [ 0 ] , l i n e a . c_str ( ) ) ;
12 for ( int i = 1 ; i < n ; i ++) {
13 g e t l i n e ( cin , l i n e a ) ;
14 strcpy ( matriz [ i ] , l i n e a . c_str ( ) ) ;
15 }
16 for ( int i =0; i <n ; i ++){
17 for ( int j =0; j <columnas +1; j ++){
18 i f ( m a t r i z [ i ] [ j ]== ’ ’ ) r e s p [ i ] [ j ]= ’ ’ ;
19 e l s e i f ( m a t r i z [ i ] [ j ]== m a t r i z [ j ] [ i ] \
20 && m a t r i z [ i ] [ j ]== ’ 1 ’ ) {
21 r e s p [ i ] [ j ]= ’ 1 ’ ;
22 }
23 e l s e i f ( m a t r i z [ i ] [ j ]== ’ 0 ’ ) r e s p [ i ] [ j ]= ’ 0 ’ ;
24 e l s e r e s p [ i ] [ j ]= m a t r i z [ i ] [ j ] ;
25 }
26 }
27 for ( int i =0; i <n ; i ++) {
28 string str ( resp [ i ] ) ;
29 cout<<s t r <<e n d l ;
30 }
31 }
Lista de Códigos Fuente 3: Ejercicio 2)c) en C++

3. Problema 3
4. Problema 4
4.1. Considere un tablero de ajedrez de tamaño 2n x2n . Demuestre
que ∀n ≥ 2, se pueden poner a lo más 22n−1 caballos sin que se
“coman” entre sí.
4.2. Programe una función que, dado n, muestre en una matriz (1
donde hay caballos, 0 donde no) una posible forma de poner
22n−1 caballos en el tablero.
Hay una manera muy simple de programar esta función. Primero sabemos que el tablero tendrá
2n · 2n = 22n . Además sabemos que si un caballo esta en una casilla blanca solo puede .atacarçasillas
negras. Es decir, si ponemos caballos en todas las casillas blancas no se comerán entre ellos. Lo
2n
mismo pasa si ponemos caballos solo en las casillas negras. Si hacemos esto pondremos 22 = 22n−1
caballos, lo que por la parte anterior es lo máximo de caballos que se pueden poner. Es decir, para
programar esto solo debemos ir saltándonos una casilla.
1 #include <b i t s / s t d c ++.h>

Tarea 1 CC3101-1 Matemáticas Discretas


4 Problema 4 6

2 using namespace s t d ;
3
4 int main ( ) {
5 int n ;
6 c i n >>n ;
7 int tam=pow ( 2 . 0 , n ) ;
8 for ( int i =0; i <tam ; i ++){
9 for ( int j =0; j <tam ; j ++){
10 int k=i+j ;
11 i f ( j==tam−1) {
12 i f ( k %2==1)cout<< ’ 0 ’<<e n d l ;
13 e l s e i f ( k %2==0)cout<< ’ 1 ’<<e n d l ;
14 }
15 e l s e i f ( k %2==0) cout<< ’ 1 ’<< ’ ’ ;
16 e l s e i f ( k %2==1) cout<< ’ 0 ’<< ’ ’ ;
17 }
18
19 }
20 }
Lista de Códigos Fuente 4: Ejercicio 4) en C++

Tarea 1 CC3101-1 Matemáticas Discretas

Você também pode gostar