生活随笔
收集整理的這篇文章主要介紹了
离散数学大作业代码及感想
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目要求 對給出的任意一個合式公式(不超過四個命題變元),用程序編程表示出來,能夠計算它在各組真值指派下所應有的真值,畫出其真值表,并輸出構成主析取范式的所有小項。涉及的運算符包括∧(&),∨(|),?(!),→(?>),?(<?>)五種運算符,對于無法由鍵盤輸入的運算符,可以使用括號內的符號代替。例如輸入: (???)∨? 難度:較難 說明: a) 能支持1-4個變元 b) 能支持1-4次邏輯運算 c) 人機交互友好,排版美觀 IDE:Microsoft Visual C++ 6.0 代碼:
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#define MAXSIZE 40
typedef char elemtype
;
char str
[ 40 ] , st
[ 40 ] , st1
[ 40 ] , st2
[ 40 ] ;
int table1
[ 16 ] [ 5 ] ;
int flag
= 1 ;
typedef struct
{ elemtype date
[ MAXSIZE
] ; int top
;
} SqStack
;
void InitStack ( SqStack
* & s
)
{ s
= ( SqStack
* ) malloc ( sizeof ( SqStack
) ) ; s
-> top
= - 1 ;
}
void DestoryStack ( SqStack
* & s
)
{ free ( s
) ;
}
bool
StackEmpty ( SqStack
* s
)
{ return ( s
-> top
== - 1 ) ;
}
bool
Push ( SqStack
* & s
, elemtype e
)
{ if ( s
-> top
== MAXSIZE
- 1 ) return false
; s
-> top
++ ; s
-> date
[ s
-> top
] = e
; return true
;
}
bool
Pop ( SqStack
* & s
, elemtype
& e
)
{ if ( s
-> top
== - 1 ) return false
; e
= s
-> date
[ s
-> top
] ; s
-> top
-- ; return true
;
}
bool
GetTop ( SqStack
* s
, elemtype
& e
)
{ if ( s
-> top
== - 1 ) return false
; e
= s
-> date
[ s
-> top
] ; return true
;
}
int calFun ( char st2
[ ] )
{ SqStack
* S
; int i
= 0 ; char x
, x1
, x2
; InitStack ( S
) ; while ( st2
[ i
] != '\0' ) { switch ( st2
[ i
] ) { case '&' : Pop ( S
, x2
) ; Pop ( S
, x1
) ; x
= ( x1
- '0' ) && ( x2
- '0' ) ; Push ( S
, ( x
+ '0' ) ) ; i
++ ; break ; case '|' : Pop ( S
, x2
) ; Pop ( S
, x1
) ; x
= ( x1
- '0' ) || ( x2
- '0' ) ; Push ( S
, ( x
+ '0' ) ) ; i
++ ; break ; case '-' : Pop ( S
, x2
) ; Pop ( S
, x1
) ; x
= ! ( x1
- '0' ) || ( x2
- '0' ) ; Push ( S
, ( x
+ '0' ) ) ; i
++ ; break ; case '=' : Pop ( S
, x2
) ; Pop ( S
, x1
) ; x
= ( x1
- '0' ) == ( x2
- '0' ) ; Push ( S
, ( x
+ '0' ) ) ; i
++ ; break ; case '~' : Pop ( S
, x1
) ; x
= ! ( x1
- '0' ) ; Push ( S
, ( x
+ '0' ) ) ; i
++ ; break ; default : while ( st2
[ i
] == '1' || st2
[ i
] == '0' ) { Push ( S
, st2
[ i
] ) ; i
++ ; } } } GetTop ( S
, x
) ; DestoryStack ( S
) ; return ( int ) ( x
- '0' ) ;
} void suffix ( char * z
, char st2
[ ] )
{ char e
; SqStack
* Optr
; InitStack ( Optr
) ; int i
= 0 ; while ( * z
!= '\0' ) { switch ( * z
) { case '(' : Push ( Optr
, '(' ) ; z
++ ; break ; case ')' : Pop ( Optr
, e
) ; while ( e
!= '(' ) { st2
[ i
++ ] = e
; Pop ( Optr
, e
) ; } z
++ ; break ; case '-' : case '=' : while ( ! StackEmpty ( Optr
) ) { GetTop ( Optr
, e
) ; if ( e
!= '(' ) { st2
[ i
++ ] = e
; Pop ( Optr
, e
) ; } else break ; } Push ( Optr
, * z
) ; z
++ ; break ; case '&' : case '|' : while ( ! StackEmpty ( Optr
) ) { GetTop ( Optr
, e
) ; if ( e
!= '(' && e
!= '-' && e
!= '=' ) { st2
[ i
++ ] = e
; Pop ( Optr
, e
) ; } else break ; } Push ( Optr
, * z
) ; z
++ ; break ; case '!' : while ( ! StackEmpty ( Optr
) ) { GetTop ( Optr
, e
) ; if ( e
!= '!' ) { st2
[ i
++ ] = e
; Pop ( Optr
, e
) ; } else break ; } Push ( Optr
, * z
) ; z
++ ; break ; default : while ( * z
== '0' || * z
== '1' ) { st2
[ i
++ ] = * z
; z
++ ; } } } while ( ! StackEmpty ( Optr
) ) { Pop ( Optr
, e
) ; st2
[ i
++ ] = e
; } st2
[ i
] = '\0' ; DestoryStack ( Optr
) ;
} void disjunctiveFun ( int table1
[ ] [ 5 ] , int h
, int num
)
{ int i
, j
; printf ( "主析取范式小項為:\n" ) ; for ( i
= 0 ; i
< h
; i
++ ) { if ( table1
[ i
] [ num
] == 1 ) { for ( j
= 0 ; j
< num
; j
++ ) { if ( table1
[ i
] [ j
] == 0 ) printf ( "%c" , '!' ) ; printf ( "%c" , st1
[ j
] ) ; if ( j
!= num
- 1 ) printf ( "%c" , '&' ) ; } printf ( "\n" ) ; } }
}
void trueTable ( char st
[ ] , int num
)
{ int h
, i
, j
, k
; int a
; int table
[ 40 ] ; char z
[ 40 ] ; h
= ( int ) pow ( 2 , num
) ; for ( i
= 0 ; i
< num
; i
++ ) { printf ( "%c\t" , st1
[ i
] ) ; } printf ( "%s\n" , str
) ; strcpy ( z
, st
) ; for ( i
= 0 ; i
< h
; i
++ ) { strcpy ( z
, st
) ; for ( j
= 0 ; j
< num
; j
++ ) { table
[ j
] = ( i
/ ( int ) pow ( 2 , j
) % 2 ) ; printf ( "%d\t" , table
[ j
] ) ; table1
[ i
] [ j
] = table
[ j
] ; } for ( k
= 0 ; z
[ k
] != '\0' ; k
++ ) { for ( j
= 0 ; st1
[ j
] != '\0' ; j
++ ) { if ( z
[ k
] == st1
[ j
] ) { z
[ k
] = table
[ j
] + '0' ; } } } suffix ( z
, st2
) ; a
= calFun ( st2
) ; printf ( "%d\n" , a
) ; table1
[ i
] [ num
] = a
; } disjunctiveFun ( table1
, h
, num
) ;
}
int judgeNum ( char st
[ ] )
{ int i
, j
, k
= 0 , num
= 0 ; for ( i
= 0 ; st
[ i
] != '\0' ; i
++ ) { if ( st
[ i
] >= 'A' && st
[ i
] <= 'Z' ) { for ( j
= 0 ; j
< i
; j
++ ) { if ( st
[ j
] == st
[ i
] ) break ; } if ( i
== j
) { st1
[ k
++ ] = st
[ i
] ; num
++ ; } } } if ( num
>= 1 && num
<= 4 ) ; else { flag
= 0 ; } return num
;
}
void judgeSymbol ( char st
[ ] )
{ int i
, j
, num
; char s0
[ 40 ] ; strcpy ( s0
, st
) ; for ( i
= 0 ; s0
[ i
] != '\0' ; i
++ ) { if ( s0
[ i
] == '(' ) for ( j
= i
; s0
[ j
] != '\0' ; j
++ ) s0
[ j
] = s0
[ j
+ 1 ] ; if ( s0
[ i
] == ')' ) for ( j
= i
; s0
[ j
] != '\0' ; j
++ ) s0
[ j
] = s0
[ j
+ 1 ] ; } for ( i
= 0 ; s0
[ i
+ 1 ] != '\0' ; i
++ ) { if ( s0
[ i
] >= 'A' && s0
[ i
] <= 'Z' ) { if ( s0
[ i
+ 1 ] == '&' || s0
[ i
+ 1 ] == '|' || s0
[ i
+ 1 ] == '-' || s0
[ i
+ 1 ] == '=' ) ; else { flag
= 0 ; break ; } } if ( s0
[ i
] == '!' ) { if ( s0
[ i
+ 1 ] >= 'A' && s0
[ i
+ 1 ] <= 'Z' ) ; else { flag
= 0 ; break ; } } if ( s0
[ i
] == '&' || s0
[ i
] == '|' || s0
[ i
] == '-' || s0
[ i
] == '=' ) { if ( s0
[ i
+ 1 ] >= 'A' && s0
[ i
+ 1 ] >= 'Z' || s0
[ i
+ 1 ] != '!' ) ; else { flag
= 0 ; break ; } } } if ( flag
== 1 ) num
= judgeNum ( st
) ; if ( flag
== 1 ) trueTable ( st
, num
) ; else printf ( "合式公式錯誤!\n" ) ; }
void judgeParentheses ( char st
[ ] )
{ int i
, left
, right
; left
= 0 ; right
= 0 ; for ( i
= 0 ; st
[ i
] != '\0' ; i
++ ) { if ( st
[ i
] == '(' ) left
++ ; if ( st
[ i
] == ')' ) right
++ ; if ( left
> right
+ 1 || left
+ 1 < right
) break ; } if ( left
!= right
) { flag
= 0 ; } else judgeSymbol ( st
) ; }
void transform ( char st
[ ] )
{ int i
, j
; for ( i
= 0 ; st
[ i
] != '\0' ; i
++ ) { if ( st
[ i
] == '<' ) { st
[ i
] = '=' ; if ( st
[ i
+ 2 ] != '\0' ) for ( j
= i
; st
[ j
] != '\0' ; j
++ ) st
[ ++ i
] = st
[ i
+ 2 ] ; else if ( st
[ i
+ 2 ] == '\0' ) st
[ ++ i
] = '\0' ; } } for ( i
= 0 ; st
[ i
] != '\0' ; i
++ ) { if ( st
[ i
] == '-' ) { if ( st
[ i
+ 1 ] != '\0' ) for ( j
= i
; st
[ j
] != '\0' ; j
++ ) st
[ ++ i
] = st
[ i
+ 1 ] ; else if ( st
[ i
+ 2 ] == '\0' ) st
[ ++ i
] = '\0' ; } }
}
void main ( )
{ while ( 1 ) { printf ( "請輸入1-4變元的一個合式公式:\n" ) ; printf ( "僅支持大寫英文字母的變元!\n" ) ; printf ( "合取(&),析取(|),否定(!),條件(->),雙條件 (<->):\n" ) ; gets ( str
) ; strcpy ( st
, str
) ; transform ( st
) ; judgeParentheses ( st
) ; system ( "pause" ) ; system ( "cls" ) ; }
}
感想:轉專業來到物聯網學院,因為轉專業需要補修大一課程的原因,打亂了自己的課表,和物聯網不同的班級上課,發現每個班的優秀的同學都好多的,感覺自己大一像是玩了一樣,而他們卻學課外的知識,什么Python、java、單片機、MySQL等等。 這次離散數學大作業,感覺內容還好吧,雖然對我來說有點吃力,沒系統的學過數據結構,C語言主要內容學完的情況下,能夠完成感覺自己還是不錯的。上課課程其他地方沒有落下,就是某些算法,耦合度等關鍵詞,因為數據結構沒上,了解的也不是很多。只能大二下再補課。 寫完這次大作業之后,感覺寫其他的程序代碼也不是很長。首先,克服了感覺自己代碼輸長了就閑麻煩,或者感覺輸入的不正確。其次,為以后打程序打下了一個比較良好的基礎。
總結
以上是生活随笔 為你收集整理的离散数学大作业代码及感想 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。