离散数学上机报告

一、 实验题目(编程上机题)
(1) 从键盘分别对P、Q输入数据1、0,分别输出P∧Q、P∨Q、P→Q的逻辑结果值。
(2) 从键盘输入无向图的邻接矩阵,判断输出该图结点最大度数、最小度数。
(3) 从键盘输入无向图的3行3列的邻接矩阵,计算该矩阵中心点,经过3条边的回路数。

二、实验要求
每题提交(1)提交代码(//有代码注解) (2)运行截图,各题用C语言编程实现,若用
其它语言编程python、java等编程语言,请在此框后面说明。
二、 实验程序代码(每题包括题号、程序代码、运行结果截图)
三、 (1)从键盘分别对P、Q输入数据1、0,分别输出P∧Q、P∨Q、P→Q的逻辑结果值。

#include <stdio.h>
#include <iostream> //求交并集额
using namespace std;
void out_screen(); //menu
int Disjunction(int x,int y);//析取函数
int Together(int x, int y); //合取函数
int condition(int x, int y);//条件运算函数
int all_put(int x, int y); // 全部输出函数
int majority(int x, int y); //多数组输入输出函数
char x;
int main() //主函数。所有程序围绕此展开
{int choose,P,Q;out_screen(); //菜单项的输出cout << "请选择上列操作:";cin >> choose; //操作的选择// loop:  cin >> choose;//if (choose < 0 || choose>6)//    goto loop; //goto语句的使用cout << "请输入P Q值并用空格隔开:";cin >> P >> Q; //输入数值 0或者 1switch (choose) { //利用switch语句case 1:Disjunction(P, Q); break; //析取函数case 2:Together(P, Q); break;   //合取函数case 3:condition(P, Q); break; //条件运算函数case 4: all_put(P, Q); break; // 全部输出函数case 5: majority(P, Q); break; //多数组输入输出函数default: printf("无本地操作!!!"); break; //输入的数值不符合规范则结束}return 0;
}
void out_screen() { //开始的显示菜单选项cout << "\n===============\t计算下面的析取合取范式请选择============\n\n";cout << ":1-输入两个数分别是P,Q并计算P∧Q值并输出:\n";//合取cout << ":2-输入两个数分别是P,Q并计算P∨Q值并输出:\n";//析取cout << ":3-输入两个数分别是P,Q并计算P→Q值并输出:\n";cout << ":4-输入两个数分别是P,Q并计算P∧Q、P∨Q、P→Q值并全部输出:\n";cout << ":5-进行数组处理,多组数据的处理\n";
}
int Disjunction(int x, int y)析取函数
{           //    1/0   1/0int choose1;if (x == 1|| y == 1) {  //有一个是1 的就都是 1cout << "P∨Q值为:1\n"; //输出 1}else {cout << "P∨Q值为:0\n"; //输出 0}cout << "是否选择其他操作(是...1/否...0):";cin >> x;if (x == 1) {  //为了避免一个使这个函数停在这里,所以要转接一下后续的三个操作do {cout << "1-输出合取值(P∧Q):\n";cout << "2-输出条件值(P→Q):\n";cout << "3-退出!";cout << "选择其他操作:";cin >> choose1;} while (choose1 < 0 || choose1 >3);if (choose1 == 1) Together(x, y); //转接的合取函数else if (choose1 == 2) condition(x, y); //转接到条件运算else if (choose1 == 3) return 0; //结束本次的运行}else return 0;
}
int Together(int x, int y)//合取函数
{int choose1;if (x == 1 && y == 1) {cout << "P∧Q值为:1\n"; //输出 1}else {cout << "P∧Q值为:0\n"; //输出 0}cout << "是否选择其他操作(是...1/否...0):";cin >> x;if (x == 1) { //为了避免一个使这个函数停在这里,所以要转接一下后续的三个操作do {cout << "1-输出析取值(P∨Q):\n";cout << "2-输出条件值(P→Q):\n";cout << "3-退出!\n";cout << "选择其他操作:";cin >> choose1;} while (choose1 < 0 || choose1 >3);if (choose1 == 1) Disjunction(x, y); //析取函数转接else if (choose1 == 2) condition(x, y); //条件运算的转接else if (choose1 == 3) return 0;//结束}else return 0;
}
int condition(int x, int y)//条件运算函数
{ //非 x析取 yint choose1;if (x == 1) x = 0;if (x == 0) x = 1; //因为关于条件运算函数是因为 P→Q<=>¬P∨Qif (x == 1 || y == 1) {cout << "P→Q的值是:1\n"; //输出 1}else {cout << "P→Q的值是:0\n"; //输出 0}cout << "是否选择其他操作(是...1/否...0):";cin >> x;if (x == 1) {do {cout << "1-输出析取值(P∨Q):\n";cout << "2-输出合取值(P∧Q):\n";cout << "3-退出!";cout << "选择其他操作:";cin >> choose1;} while (choose1 < 0 || choose1 > 3); //这个是有限定的if (choose1 == 1) Disjunction(x, y); //析取函数转接else if (choose1 == 2) Together(x, y); //合取函数else if (choose1 == 3) return 0; //本次结束}else return 0;
}
int all_put(int x, int y)//全部打印输出
{int t = x * y; //其实本来用t来表示,但是后来想想还是多此一举if (t == 1) cout << "P∧Q的值为: 1\n P∨Q的值为:1\n P→Q的值为: 1";//只有俩都不是0的乘才不为0else if(x==0&&y!=0) cout << "P∧Q的值为: 0\n P∨Q的值为:1\n P→Q的值为: 1"; //else if(x != 0 && y == 0) cout << "P∧Q的值为: 0\n P∨Q的值为:1\n P→Q的值为: 0";else if (x == 0 && y == 0) cout << "P∧Q的值为: 0\n P∨Q的值为:0\n P→Q的值为: 1";//他俩都是return 0;
}
int majority(int x, int y) {cout << "*******\t恭喜你选择了最难的,下面我将为您计算******\n";int  arr1[1001], arr2[1001],deal[1001],n;cout << "请需要计算N组数据,请输入N:";cin >> n;for (int i=0; i < n;i++) { //数据的输入//cin >> arr1[i++] >> arr2[i++];scanf_s("%d %d", &arr1[i], &arr2[i]);//给俩数组arr1[i] arr2[i]}for (int j = 0; j < n; j++) {//数据的处理if (arr1[j] ==1 && arr2[j] == 1) deal[j] = 1;//其实就是和上边的t的作用是一样的else if(arr1[j] ==0&& arr2[j]!=0) deal[j] = 2;else if (arr1[j] != 0 && arr2[j] == 0) deal[j] = 3;else if (arr1[j] == 0 && arr2[j] == 0) deal[j] = 4;//这个是两个都是0 }for (int j = 0; j < n; j++) {switch (deal[j]) {//也是利用switch的来进行多次判断case 1: cout << "P∧Q的值为: 1\n P∨Q的值为:1\n P→Q的值为: 1\n\n"; break;case 2: cout << "P∧Q的值为: 0\n P∨Q的值为:1\n P→Q的值为: 1\n\n"; break;case 3: cout << "P∧Q的值为: 0\n P∨Q的值为:1\n P→Q的值为: 0\n\n"; break;case 4: cout << "P∧Q的值为: 0\n P∨Q的值为:0\n P→Q的值为: 1\n\n"; break;}}return 0;
}

六、 (2)从键盘输入无向图的邻接矩阵,判断输出该图结点最大度数、最小度数。

#include <iostream>
#include<cstring>
using namespace std;
#define N 1001
void func(int arr[][N], int n); //二维数组的调用
void out(int max, int min);
int arr[N][N], n;//全局数组和全局变量
int main()
{cout << "请输入矩形的阶数:"; //输入阶数cin >> n;cout << "输入" << n << "行" << n << "列的数据值:\n";for (int i = 0; i < n; i++) {  //二维数组数据的输入for (int j = 0; j < n; j++) {cin >> arr[i][j]; //数据的输入}}func(arr, n); //调用函数return 0;
}
void func(int arr[][N], int n)
{int max = 0, min = 0, t = 0, x = 0; //max 最后值 min 最小值 t对每一个来计数度  x输出结点for (int i = 0; i < n; i++) {  //对二维数组来进行遍历for (int j = 0; j < n; j++) {if (arr[i][j] != 0) {//如果发现是1 的就进行计数if (arr[i][j] == 1)t++;//递增elset += 2;}}if (i == 0)//只有开始的时候一个max = min = t; //初始的最大值最小值都是v1,然后与后续比较x++;cout << "V" << x << "的度是:" << t << "\n";if (t >= max) {//如果下一个度大于v1,那么值就赋值给maxmax = t;//赋值给max}if (t <= min) {//如果下一个度小于v1,那么值就赋值给minmin = t;}t = 0; //从零开始在进行}out(max, min);//函数的调用函数,反正我没有返回值
}
void out(int max, int min) {cout << "在此无向图的邻接矩阵中\n";cout << "该图结点最大度数为" << max << "\n";cout << "该图结点最小度数为" << min << "\n";
}
七、	 
八、	   (3)从键盘输入无向图的33列的邻接矩阵,计算该矩阵中心点,经过3条边的回路数。
#include <iostream> 
using namespace std;
void in(int* arr, int n);                       //输入函数,输入一个n阶矩阵的值
int* ExponentiationForTwo(int* arr, int n);    //求二次幂函数;传入矩阵数组,矩阵的阶数,求的幂次;返回一个矩阵数组
void out(int* arr, int n);   //输出函数;输出一个n阶矩阵
int sove[1000];
int main()
{cout << "请输入矩形的阶数:";//输入矩阵阶数nint n;cin >> n;//为矩阵数组分配内存,分配n*n个int类型大小的空间给arr即矩阵元素个数int* arr = (int*)malloc(sizeof(int) * n * n);//输入矩阵各个元素的值in(arr, n);//算出arr的二次幂arr = ExponentiationForTwo(arr, n);//输出矩阵各个元素的值,这个时候arr是二次的cout << "输出二阶幂:\n";out(arr, n);//算出arr的二次幂,因为上面已经算过一次了,所以这个地方算的是三次幂了arr = ExponentiationForTwo(arr, n);//输出矩阵各个元素的值,这个时候arr是三次的cout << "输出"<<n<<"阶幂:\n";out(arr, n);//所以如果要求n次幂,只需要循环调用   arr= ExponentiationForTwo(arr, n);这句话就行了,类似于i=i*i;return 0;
}
void in(int* arr, int n)
{cout << "输入" << n << "行" << n << "列的数据值:\n";//二维数组数据的输入for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {cin >> arr[i * n + j];sove[i * n + j] = arr[i * n + j];}}
}int* ExponentiationForTwo(int* arr, int n)
{int* tempArr1 = (int*)malloc(sizeof(int) * n * n);//把arr的值拷贝到tempArr中for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {tempArr1[i * n + j] = arr[i * n + j];}}//计算tempArr的二次幂,将结果存入到arr中for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){int sum = 0;for (int k = 0; k < n; k++){sum += tempArr1[i * n + k] * sove[k * n + j];}arr[i * n + j] = sum;}}//这个时候,原矩阵arr的值已经是arr*arr了,记得要将tempArr申请的内存释放free(tempArr1);return arr;
}
void out(int* arr, int n)
{for (int i = 0; i < n; i++) { //二维数组数据的输入for (int j = 0; j < n; j++) {cout << arr[i * n + j] << " ";}printf("\n");}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/34198.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

synchronized关键字和ReentrantLock在不同jdk版本中性能哪个高?该怎么选择呢?

synchronized关键字和ReentrantLock在不同JDK版本中的性能差异经历了显著的变化。早期&#xff0c;在JDK 1.5及以前的版本中&#xff0c;ReentrantLock通常提供了更好的性能&#xff0c;主要是因为synchronized关键字的实现较为简单&#xff0c;没有太多的优化&#xff0c;导致…

图片如何去水印,分享4个小妙招,手把手教会你!

作为一个经常逛社区网站下载表情包、头像的人&#xff0c;遇到的一个大难题就是图片有水印。如何才能快速去除水印&#xff1f;询问了一圈身边朋友&#xff0c;搜集了各种资料&#xff0c;小编整理了4个超好用的方法。 如果大家和小编一样&#xff0c;能坐着就不站着&#xff0…

PHP 高频面试题

PHP 初级面试题及详细解答 1. 什么是 PHP&#xff0c;PHP 的全称是什么&#xff1f; 解答: PHP 是一种流行的开源脚本语言&#xff0c;特别适合用于 web 开发并可以嵌入 HTML。PHP 的全称是 “PHP: Hypertext Preprocessor”&#xff0c;它最初代表的是 “Personal Home Page…

Python简单实现自动识别并填加验证码

实现自动识别网页中的验证码并填写&#xff0c;需要结合使用网络爬虫技术、图像识别&#xff08;OCR&#xff09;&#xff0c;以及可能的浏览器自动化工具&#xff08;如Selenium&#xff09;。以下简单实现一下如何结合这些技术来实现这一目标&#xff1a; 步骤 1: 获取验证码…

Rust单元测试、集成测试

单元测试、集成测试 在了解了如何在 Rust 中写测试用例后&#xff0c;本章节我们将学习如何实现单元测试、集成测试&#xff0c;其实它们用到的技术还是上一章节中的测试技术&#xff0c;只不过对如何组织测试代码提出了新的要求。 单元测试 单元测试目标是测试某一个代码单…

细说QT表格类复杂控件用法(TableView/TreeView/ListView)

文章目录 表格类控件样式控制设置表格类控件指示器样式表格类控件嵌入自定义控件表格控件禁用列拖动设置列宽和行高表格选中操作数据库+表格控件选中操作和选中样式Qt提供了几种基于模型/视图(Model/View)架构的表格类控件,主要包括QTableView、QTreeView和QListView。这些控件…

Makefile中lastword的用法

Makefile中lastword的用法 在 Makefile 中&#xff0c;lastword 函数用于返回参数列表中的最后一个单词&#xff08;以空格或制表符分隔&#xff09;。它的基本语法如下&#xff1a; lastword words其中&#xff0c;words 是一个包含多个单词的参数列表&#xff0c;可以是变量…

一次DC1靶机的渗透测试

确定目标IP&#xff1a; nmap -sP 192.168.11.1/24 发现目标机器 扫描开放的端口&#xff1a; nmap -T4 -A -v 192.168.11.145 发现开放了一个80端口&#xff0c;并且给出了是Drupal的管理系统 浏览器访问这个服务&#xff1a; 因为这是一个Drupal的管理系统&#xff0c;那么…

Pandas基础应用:数据处理与分析的利器

概括 在数据科学领域&#xff0c;Pandas无疑是一个强大的数据处理和分析工具。它提供了高效、灵活的数据结构和数据分析功能&#xff0c;使得数据清洗、转换、聚合和可视化等操作变得轻而易举。本文将介绍Pandas的基础应用&#xff0c;帮助读者快速上手并掌握其核心功能。 一…

openlayers禁用鼠标滚轮放大、拖拽事件并设置为只有按住Ctrl键才可以执行放大拖拽操作

禁用openlayers鼠标滚轮放大、拖拽移动地图设置这两行代码即可&#xff1a; new Map({interactions: defaults({ dragPan: false, mouseWheelZoom: false }), }) 或者设置只允许按住Ctrl键才可以操作 import { DragPan, MouseWheelZoom, defaults } from "ol/interact…

利用第三方服务对目标进行被动信息收集防止被发现(web安全白帽子)

利用第三方服务对目标进行被动信息收集防止被发现&#xff08;web安全白帽子&#xff09; 1 被动信息收集1.1 信息收集内容1.2 信息用途 2 信息收集-DNS2.1 DNS信息收集NSLOOKUP2.1.1 ping2.1.2 nslookup 2.2 DNS信息收集-DIG&#xff08;此命令查到的结果更复杂些&#xff0c;…

算法训练营day19--530.二叉搜索树的最小绝对差+501.二叉搜索树中的众数+236. 二叉树的最近公共祖先

一、530.二叉搜索树的最小绝对差 题目链接&#xff1a;https://leetcode.cn/problems/minimum-absolute-difference-in-bst/ 文章讲解&#xff1a;https://programmercarl.com/0530.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E6%9C%80%E5%B0%8F%E7%BB%9D%E5%AF…

shell脚本中sudo密码自动输入

在shell脚本中&#xff0c; 我们可能需要用到sudo权限&#xff0c; 如果没有免密设置&#xff0c; 是需要输入密码的&#xff0c; 但是在自动化的脚本中&#xff0c;我们不希望进行手动密码输入&#xff0c;这时就需要用到密码自动输入。 方法如下: echo "my_passwd&quo…

【ubuntu noble】给 apt 添加代理

修改apt.conf sudo vi /etc/apt/apt.conf添加以下内容 Acquire::http::Proxy "http://proxy.example.com:8080"; Acquire::https::Proxy "http://proxy.example.com:8080";出现公钥问题 去我上一篇博客&#xff0c;有解决方案

Ext JS+Spring Boot 使用Ajax方式上传文件

实现方式 使用 Ext JS 进行 AJAX 调用以传递文件通常涉及到创建一个 FormData 对象,将文件附加到这个对象中,然后通过 Ext JS 的 AJAX API 发送这个对象。 基本步骤 以下是使用 Ext JS 发送文件的基本步骤: 准备文件和数据: 首先需要获取到要传递的文件 创建 FormData 对…

红队内网攻防渗透:内网渗透之内网对抗:横向移动篇NTLM中继Relay重放SMBEWSLADP协议强制认证钓鱼监听

NTLM Relay其实严格意义上并不能叫NTLM Relay,而是应该叫 Net-NTLM Relay。它是发生在NTLM认证的第三步,在 Type3 Response消息中存在Net-NTLM Hash,当攻击者获得了Net-NTLM Hash后,可以进行中间人攻击,重放Net-NTLM Hash,这种攻击手法也就是大家所说的NTLM Relay(NTLM 中…

MAB规范(3):Chapter6 Glossary 术语表

第6章 - 术语表 此章不做过多的批注&#xff0c;都是些简单的术语解释。

学分制系统 GetCalendarContentById SQL注入致RCE漏洞复现

0x01 产品简介 学分制系统由上海鹏达计算机系统开发有限公司研发,是基于对职业教育特点和需求的深入理解,结合教育部相关文件精神,并广泛吸纳专家、学者意见而开发的一款综合性管理系统。系统采用模块化的设计方法,方便学校根据自身教学改革特点、信息化建设进程情况选择、…

某某商场对账返款单,table

好久不写原生html&#xff0c;今天写了个&#xff0c;快忘完了 。。。 Double Header Table ***商场统一收银结算商户对账返款单 商场&#xff08;盖章有效&#xff09; 铺位名称&#xff1a; 铺位号&#xff1a; 制单人&#xff1a; 制单日期&#xff1a; </tr><tr&…

前端微应用打开新的窗口时,如何防止matched数据丢失?

本文章基于vueqiankun微前端架构 1、qiankun 与 matched &#xff08;1&#xff09;在 qiankun 微前端架构中&#xff0c;matched 数据通常与路由状态相关&#xff0c;是路由库&#xff08;如 vue-router、react-router 等&#xff09;内部使用的一个状态 &#xff08;2&…