日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

离散数学大作业代码及感想

發布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 离散数学大作业代码及感想 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目要求
對給出的任意一個合式公式(不超過四個命題變元),用程序編程表示出來,能夠計算它在各組真值指派下所應有的真值,畫出其真值表,并輸出構成主析取范式的所有小項。涉及的運算符包括∧(&),∨(|),?(!),→(?>),?(<?>)五種運算符,對于無法由鍵盤輸入的運算符,可以使用括號內的符號代替。例如輸入:
(???)∨?
難度:較難
說明:
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; /*str接收輸入的字符,st是轉化后的字符, st1儲存變量,st2變量轉化為相應公式; table1儲存真值表*/ /* 數據結構自己學的,然后寫后綴表達式時一直提示一些符號沒有 然后我猜想是頭文件沒有,但是網上找了好多,都不對 于是我就對著買的書,把這些定義全部打上了。*/ 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);}elsebreak;}Push(Optr,*z);z++;break;case'&':case'|': //合取和析取while(!StackEmpty(Optr)){GetTop(Optr,e);if(e!='('&&e!='-'&&e!='='){st2[i++]=e;Pop(Optr,e);}elsebreak;}Push(Optr,*z);z++;break;case'!': //否定while(!StackEmpty(Optr)){GetTop(Optr,e);if(e!='!'){st2[i++]=e;Pop(Optr,e);}elsebreak;}Push(Optr,*z);z++;break;default: //對應真值while(*z=='0'||*z=='1'){st2[i++]=*z;z++;}//st2[i++]='#'; //我不知道這行有什么用,書上有,我加上后運行不了}}while(!StackEmpty(Optr)) {Pop(Optr,e);st2[i++]=e; //出棧}st2[i]='\0'; //給st2加上結束符DestoryStack(Optr); //銷毀棧 }void disjunctiveFun(int table1[][5],int h,int num) {int i,j;printf("主析取范式小項為:\n"); //如果合式公式真值為1就打印for(i=0;i<h;i++){ if(table1[i][num]==1){for(j=0;j<num;j++){ //printf("%d",table1[i][j]);if(table1[i][j]==0) //對應字母為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'; //弄了好長時間,char不能儲存int}}}suffix(z,st2); //轉化為后綴表達式// printf("%s",st2);a=calFun(st2); //計算后綴表達式printf("%d\n",a);// printf("%s\n",z);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]; //將字母存放到數組st1中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語言主要內容學完的情況下,能夠完成感覺自己還是不錯的。上課課程其他地方沒有落下,就是某些算法,耦合度等關鍵詞,因為數據結構沒上,了解的也不是很多。只能大二下再補課。
寫完這次大作業之后,感覺寫其他的程序代碼也不是很長。首先,克服了感覺自己代碼輸長了就閑麻煩,或者感覺輸入的不正確。其次,為以后打程序打下了一個比較良好的基礎。

總結

以上是生活随笔為你收集整理的离散数学大作业代码及感想的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。