简易英文统计和加密系统的设计实现(纯C语言实现,包含文件操作、注释多、易理解)

news2025/1/15 17:15:02

❤️作者主页:微凉秋意
🔥系列专栏:数据结构与课程设计
✅作者简介:后端领域优质创作者🏆,CSDN内容合伙人🏆,阿里云专家博主🏆

文章目录

  • 前言
  • 部分功能、开发环境与项目结构
  • 主函数设计
  • statistics 头文件以及源文件
    • statistics.h
    • statistics.c
  • encryption 头文件以及源文件
    • encryption.h
    • encryption.c


前言

耗时一天一夜写了一个简易的《英文统计和加密系统》,实际上就是对字符数组的基本操作的各种使用,其中也牵扯到简单的读写文件,把结构体存入文本文件等知识。总体来说,只要在编写前搭建好一个思维框架,逐个实现功能就轻松的多了。

部分功能、开发环境与项目结构

部分功能展示:

在这里插入图片描述
开发环境:

我使用的开发环境是 Visual Stduio 2022(2019版本应该更好)。

项目结构:
包含两个头文件和对应的源文件, main.c,以及三个文本文件:

在这里插入图片描述

主函数设计

// 英文统计和加密系统
// statistics 统计
// encryption 加密(结构体相关功能也在此处)
#include"statistics.h"
#include"encryption.h"
int main() {
	char buf[BUFSIZE];
	memset(buf, '0', sizeof(buf)); // 给字符数组初始化为 '0'
	showInfo(buf);
	printf("当前字母数:%d\n",countCharacter(buf));
	printf("当前单词数:%d\n",countWord(buf));
	printf("第12个字母为:");
	show_i(buf, 12);
	printf("与字母 'b'相比,小于,等于,大于的字母个数分别为:");
	classify_c(buf, 'b');
	int x = count_appear(buf, 'y');
	printf("字母y(不区分大小写)出现的次数为:%d\n", x);
	printf("所有y出现的下标为:");
	int* A = (int*)malloc(sizeof(int) * x +1);
	int *n = location_index(buf, A, 'y');
	for (int i = 0; i < x; i++) {
		printf("%3d", n[i]);
	}
	printf("\n");
	encryption(buf, 3);
	/*puts(buf);*/
	printf("将26个英文字母打包成一个结构体,附加对应次数\n");
	alphabet chars;
	Initialize(&chars);
	printf("计算字母出现次数并存入文本文件中:\n");
	count_letters(buf, &chars);
	encrypt en = maxTimes(chars);
	encrypt minEn = minTimes(chars);
	printf("出现最多的字母为:%c,对应次数为:%d\n", en.data, en.num);
	printf("出现最少的字母为:%c,对应次数为:%d\n", minEn.data, minEn.num);
	printf("字母平均出现次数:%.2f\n", averageNum(chars));
	int k = 8;
	char* list = list_k(chars,k);
	printf("前%d名字母序列为:", k);
	for (int i = 0; i < k; i++) {
		printf("%2c", list[i]);
	}
	select_sort(chars);
	
	//setText(&chars); // 需要更新结构体文本文件时使用
}

主函数完全可以使用 循环+switch-case来做一个菜单,重复使用功能。
实现效果已经在上文中展示,后序不再展示。

statistics 头文件以及源文件

statistics.h

#pragma once // 避免重复包含头文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define BUFSIZE 512
// 获取原文长度
int get_length(char* buf);
// 获取文本的原文内容
void getText(char *buf);
// 得到原文内容
void showInfo(char *buf);
// 统计原文字母个数
int countCharacter(char* buf);
// 统计原文单词个数
int countWord(char* buf);
// 显示原文第i个单词
void show_i(char* buf,int i);
// 根据字符c的大小,分为三部分
void classify_c(char* buf, char c);
// 定位值为c的下标
int* location_index(char* buf, int* index,char c);
// 字符c的出现次数
int count_appear(char* buf, char c);

statistics.c

#include"statistics.h"
// 获取原文有效长度
int get_length(char* buf) {
	int len = 0;
	for (int i = 0; i < BUFSIZE && buf[i] != '0'; i++) {
		len++;
	}
	return len;
}

//用子函数实现从文本文件读取原文的操作
void getText(char *buf) {
	FILE* file;
	file = fopen("myfile.txt", "r");
	if (file == NULL) {
		printf("打开文件失败!");
		exit(-1);
	}
	char arr[BUFSIZE];
	memset(arr, '0', sizeof(arr));
	fgets(arr, sizeof(arr), file);
	fclose(file);
	strcpy(buf, arr);
}

//1.定义一字符数组word,用户输入原文或从一文本文件读入(调用子函数)原文(一段英文),
// 输出显示该原文,以及其总长度。

void showInfo(char* buf) {
	printf("1.输入原文:\n");
	printf("2.读取原文\n");
	int choice = 0;
	scanf("%d", &choice);
	rewind(stdin); // 清空缓冲区
	if (choice == 1) {
		char arr[BUFSIZE];
		memset(arr, '0', sizeof(arr));
		fgets(arr, sizeof(arr), stdin);
		strcpy(buf, arr);
	}
	else if (choice == 2) {
		getText(buf);
	}
	else {
		printf("请正确选择获取原文方式!"); exit(-1);
	}
	int sum = get_length(buf);
	if (choice==2) printf("总长度为:%d\n",  --sum); // 去掉自带的 .
	else printf("总长度为:%d\n",  sum-2); // fgets会多读一个字符
	printf("原文:%s\n", buf);
}
//3.用子函数实现统计原文中的字母个数。
int countCharacter(char* buf) {
	int i;
	int count = 0;
	for (i = 0; i < BUFSIZE&&buf[i]!= '0'; i++) {
		if (buf[i] >= 'a' && buf[i] <= 'z' || buf[i] >= 'A' && buf[i] <= 'Z') {
			count++;
		}
	}
	return count;
}
//4.用子函数实现统计原文中的单词个数。
int countWord(char* buf) {
	int i;
	int count = 0;
	for (i = 1; i < BUFSIZE&&buf[i]!='0'; i++) {
		if (buf[i] == ' ' &&(buf[i - 1] >= 'a' && buf[i - 1] <= 'z' || buf[i - 1] >= 'A' && buf[i - 1] <= 'Z'))
			count++;
	}
	if (buf[i - 1] >= 'a' && buf[i - 1] <= 'z' || buf[i - 1] >= 'A' && buf[i - 1] <= 'Z')
		count++;
	return count;
}

//5.定义一子函数,输入任一下标值i,检查i的输入合法性,
// 合法输出显示word的第i个字母,否则输出“输入i不合法”。
void show_i(char* buf,int i) {
	int len = countCharacter(buf);
	if (i<1 || i>len) {
		printf("输入i不合法\n");
		exit(-1);
	}
	int index = 0; // 记录当前字母位序
	for (int j = 0; j < BUFSIZE && buf[j] != '0'; j++) {
		if (buf[j] >= 'a' && buf[j] <= 'z' || buf[j] >= 'A' && buf[j] <= 'Z') {
			++index;
			if (index == i) {
				printf("%c\n", buf[j]);
				return;
			}
		}
	}

}

//6.定义一子函数,输入一字母c, 分别输出word中大于字母c的个数和小于字母c的个数,
// 以及等于字母c的个数。
void classify_c(char* buf, char c) {
	char arr[BUFSIZE];
	memset(arr, '0', sizeof(arr));
	int index = 0; // 记录当前字母位序
	for (int j = 0; j < BUFSIZE && buf[j] != '0'; j++) {
		if (buf[j] >= 'a' && buf[j] <= 'z' || buf[j] >= 'A' && buf[j] <= 'Z') {
			arr[index++] = buf[j];
		}
	}
	// 冒泡排序(升序)
	for (int i = 0; i < index; i++) {
		char flag = 'f';// 标志位
		for (int j = index-1; j > i; j--) {
			if (arr[j] < arr[j - 1]) {
				flag = 't';
				char ch = arr[j];
				arr[j]=arr[j-1];
				arr[j - 1] = ch;
			}
		}
		if (flag == 'f') break;
	}
	int l, h, e,i;
	for (l = 0, h = 0, e = 0, i = 0; i < index; i++) {
		if (arr[i] < c) l++;
		else if (arr[i] == c) e++;
		else break;
	}
	h = index - l - e;
	printf("little:%d equal:%d high:%d\n", l, e, h);
}

//7.定义一子函数,实现字符查找功能:判定该字母是否存在,
// 是则返回每一个出现位置的下标(或者首次出现的下标位置),否则返回 - 1。
int* location_index(char* buf, int *index,char c) {
	int i;
	int in = 0;
	char flag = 'f';// 如果最终还是f,说明找不到该字母
	for (i = 0; i < BUFSIZE && buf[i] != '0'; i++) {
		if (buf[i] == c||c == buf[i]+32||c==buf[i]-32) index[in++] = i;
		flag = 't';
	}
	if (flag == 'f') return -1;
	return index;
}
//8.定义一子函数,实现输入一字母,统计原文中该字母的出现次数(字母不区分大小写, 实现合并计数)
// 并返回。函数中需要有对输入的字母是否输入异常判定和捕获操作,并在主程序中进行输入错误提示。
int count_appear(char* buf, char c) {
	if (!(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')) {
		printf("当前字符为%c,请输入正确字母\n", c);
		exit(-1);
	}
	int i;
	int count = 0;
	for (i = 0; i < BUFSIZE && buf[i] != '0'; i++) {
		if (c == buf[i] || c == buf[i] + 32 || c == buf - 32) count++;
	}
	return count;
 }
 

encryption 头文件以及源文件

encryption.h

#pragma once
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

// 字母以及出现次数的结构体
typedef struct {
	char data; // 显示字母
	int num; // 出现次数
}encrypt;

typedef struct {
	encrypt letters[26];
}alphabet;
// 初始化字母表
void Initialize(alphabet *chars);
// 计算各个字母的出现次数
void count_letters(char* buf, alphabet* chars);
// 存入结构体文本文件
void setText(alphabet *chars);
// 返回出现次数最多的字母
encrypt maxTimes(alphabet chars);
// 返回出现次数最少的字母
encrypt minTimes(alphabet chars);
// 计算字母出现的平均次数
float averageNum(alphabet chars);
// 出现前k名的字母序列
char* list_k(alphabet chars, int k);
// 选择升序或者降序排序
void select_sort(alphabet chars);
// 加密算法,根据n的位置循环后移
void encryption(char* buf, int n);
// 存入加密的文本文件
void setEncryptText(char* buff);

encryption.c

#include"encryption.h"
#include"statistics.h"

//9.将26个英文字母和其对应的出现次数打包定义为一个结构体类型来存储。
// 初始化结构体数组
void Initialize(alphabet* chars) {
	int k = 0;
	char c = 'a';
	for (int i = 0; i < 26; i++) {
		chars->letters[i].num = k;
		chars->letters[i].data = c + i;
	}

}
//10.设计实现一新的子函数,针对读入的原文,统计出26个英文字母在单词中出现的次数,
//并统一存储到9定义的结构体数组中,然后完成11到16的操作。
void count_letters(char* buf, alphabet* chars) {
	printf("1.输入原文:\n");
	printf("2.读取原文\n");
	int choice = 0;
	int sum = 0;
	scanf("%d", &choice);
	rewind(stdin); // 清空缓冲区
	if (choice == 1) {
		char arr[BUFSIZE];
		memset(arr, '0', sizeof(arr));
		fgets(arr, sizeof(arr), stdin);
		strcpy(buf, arr);
	}
	else if (choice == 2) {
		getText(buf);
	}
	else {
		printf("请正确选择获取原文方式!"); exit(-1);
	}
	char arr[BUFSIZE]; // 最终转化为全部字母
	memset(arr, '0', sizeof(arr));
	int index = 0; // 记录当前字母位序
	for (int j = 0; j < BUFSIZE && buf[j] != '0'; j++) {
		if (buf[j] >= 'a' && buf[j] <= 'z' || buf[j] >= 'A' && buf[j] <= 'Z') {
			arr[index++] = buf[j];
		}
	}
	for (int i = 0; i < index; i++) {
		for (int j = 0; j < 26; j++) {
			if (arr[i] == chars->letters[j].data || arr[i] + 32 == chars->letters[j].data)
				chars->letters[j].num++;
		}
	}
}

//11.将结构体数组结果存储到一文本文件。
void setText(alphabet* chars) {
	FILE* fp;
	fopen_s(&fp, "struct.txt", "wt+");    //打开文件
	for (int i = 0; i < 26; i++)            //将N条信息存储进去
	{
		fprintf(fp, "%d %d\n", chars->letters[i].data, chars->letters[i].num);
	}
	fclose(fp);    //关闭文件

	//encrypt buff[26];
	//FILE* fpp;
	//fopen_s(&fpp, "struct.txt", "rb");
	//fread(buff, sizeof(encrypt), 26, fpp); // 将N条消息全部从文件中读取出来
	//fclose(fpp);
}

//12.设计一子函数:返回出现次数最多的字母和对应次数。
encrypt maxTimes(alphabet chars) {
	int max = chars.letters[0].num;
	int i, index;
	for (i = 1, index = 0; i < 26; i++) {
		if (max < chars.letters[i].num) {
			max = chars.letters[i].num;
			index = i;
		}
	}
	return chars.letters[index];
}

//13.设计一子函数:返回出现次数最少的字母和对应次数。
encrypt minTimes(alphabet chars) {
	int min = chars.letters[0].num;
	int i, index;
	for (i = 1, index = 0; i < 26; i++) {
		if (min > chars.letters[i].num) {
			min = chars.letters[i].num;
			index = i;
		}
	}
	return chars.letters[index];
}

//14.设计一子函数:返回26个字母的平均出现次数。
float averageNum(alphabet chars) {
	float avg = 0.0;
	for (int i = 0; i < 26; i++) {
		avg += chars.letters[i].num;
	}
	avg /= 26;
	return avg;
}
//15. 设计一子函数:输入数字k,返回出现次数前k名的字母序列
char* list_k(alphabet chars, int k) {
	if (k < 1 || k>26) exit(-1);
	char* list = (char*)malloc(sizeof(char) * k);
	// 冒泡排序
	for (int i = 0; i < 26; i++) {
		char flag = 'f';
		for (int j = 25; j > i; j--) {
			if (chars.letters[j].num > chars.letters[j - 1].num) {
				flag = 't';
				encrypt temp = chars.letters[j];
				chars.letters[j] = chars.letters[j - 1];
				chars.letters[j - 1] = temp;
			}
		}
		if (flag == 'f') break;
	}
	for (int i = 0; i < k; i++) {
		list[i] = chars.letters[i].data;
	}
	return list;
}
//16.定义一排序子函数,实现对结构体数组结果按照出现次数进行升序或降序排列
//(由用户在运行时选择排序方式), 输出排序结果以及对应的字母。
void select_sort(alphabet chars) {
	printf("\n1.升序排列\n2.降序排列\n");
	int choice = 0;
	scanf("%d", &choice);
	if (choice == 2) {
		for (int i = 0; i < 26; i++) {
			char flag = 'f';
			for (int j = 25; j > i; j--) {
				if (chars.letters[j].num > chars.letters[j - 1].num) {
					flag = 't';
					encrypt temp = chars.letters[j];
					chars.letters[j] = chars.letters[j - 1];
					chars.letters[j - 1] = temp;
				}
			}
			if (flag == 'f') break;
		}
	}
	else if (choice == 1)
	{
		for (int i = 0; i < 26; i++) {
			char flag = 'f';
			for (int j = 25; j > i; j--) {
				if (chars.letters[j].num < chars.letters[j - 1].num) {
					flag = 't';
					encrypt temp = chars.letters[j];
					chars.letters[j] = chars.letters[j - 1];
					chars.letters[j - 1] = temp;
				}
			}
			if (flag == 'f') break;
		}
	}
	else {
		printf("请正确选择排序规则!");
		exit(-1);
	}
	printf("排序结果为:");
	for (int i = 0; i < 26; i++) {
		printf("%2c", chars.letters[i].data);
	}
}
//17.用子函数实现将读取的原文按规则加密后存入另一字符数组中。
//电文加密 : 问题描述:为使电文保密,常按一定规律将其转换成密文后发送,
//收报人再按约定的规律将其译回原文。设定加密规则为:
//每个字母变成其后的第n(n由用户输入指定)个字母,如A变成其后第n个字母….。
//说明 : 只对原文中的英文字母加密, 其他非英文字母要原样保留。
void encryption(char* buf, int n) {
	n %= 26; // 确保英文字母加密后还是英文字母
	int i;
	int len = get_length(buf);
	char* arr = (char*)malloc(len * sizeof(char));
	memset(arr, '0', sizeof(arr));// 初始化
	for (i = 0; i < len; i++) {
		if (buf[i] >= 'a' && buf[i] <= 'z' || buf[i] >= 'A' && buf[i] <= 'Z') {

			if (buf[i] + n > 'z') {
				arr[i] = buf[i] + n - 26;
			}
			else if (buf[i] <= 'Z' && buf[i] + n > 'Z') {
				arr[i] = buf[i] + n - 'Z' + 'A'-1;
			}
			else {
				arr[i] = buf[i] + n;
			}
		}
		else {
			arr[i] = buf[i];
		}
	}
	printf("加密后:%s\n", arr);
	setEncryptText(arr);
}
//18.用子函数实现将密文存入密文文本文件中。
void setEncryptText(char* buff) {
	FILE* fp;
	fp = fopen("encryption.txt", "wt+");
	if (fp == NULL) {
		printf("打开文件失败!");
		exit(-1);
	}
	fputs(buff, fp);
	fclose(fp);
}


myfile.txt文件中可自行输入密文(26个英文字母大小写,各种符号,数字等等);

struct.txt文件有26行,对应着原文中26个英文字母出现的次数以及ASCII码值;

encryption.txt文件是myfile.txt文件中的字母通过循环后移 n 位得到,其中的难点
在于大写字母后移超过Z时的处理方法,这点大家可以在encryption.c文件中的encryption
函数中获得灵感。

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

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

相关文章

十二、模块化开发

一、什么是模块化&#xff1f; 到底什么是模块化、模块化开发呢&#xff1f; 事实上模块化开发最终的目的是将程序划分成一个个小的结构&#xff1b;这个结构中编写属于自己的逻辑代码&#xff0c;有自己的作用域&#xff0c;定义变量名词时不会影响到其他的结构&#xff1b;…

上海车展:油电反转,新能源车竞争白热化

还记得2009年的上海车展&#xff0c;新能源车初来乍到&#xff0c;一共才展出47辆&#xff0c;占所有展出车辆5.12%&#xff0c;今年参展车型中&#xff0c;传统燃油车型有58款&#xff0c;新能源车有76款&#xff0c;新能源车第一次超过燃油车&#xff0c;实现油电反转。 电动…

均值滤波 附带简易code

1.概念介绍  均值滤波是典型的 线性滤波算法&#xff0c;是指用当前像素点周围nxn个像素值的均值来代替当前像素值。使用该方法遍历处理图像内的每一个像素点&#xff0c;可完成整幅图像的均值滤波。 2.基本原理  如图2-1&#xff0c;我们对第5行第5列的像素点进行均值滤波时…

D. Labyrinth(双端队列BFS)

Problem - D - Codeforces 你正在玩一款电脑游戏。其中一个关卡将你置于一个迷宫中&#xff0c;它由n行构成&#xff0c;每行包含m个单元格。每个单元格要么是空闲的&#xff0c;要么被障碍物占据。起始单元格位于第r行和第c列。在一步中&#xff0c;如果目标单元格没有被障碍物…

Codeforces-Round-826-Div-3-E-Sending-a-Sequence-Over-the-Network

title: Codeforces Round 826 (Div. 3) E. Sending a Sequence Over the Network date: 2023-04-18 20:04:57 categories: AlgorithmCodeforces tags:codeforces动态规划1600 E. Sending a Sequence Over the Network ​ 题目大意 给你一个长度为n的数组&#xff0c;问整个…

【Java 8 Time】Java8时区时间运用详解,2万字助你通关java.time包

目录 前言一、时区与时间1. 世界标准时&#xff1a;UTC、GMT、UT2. 地区时&#xff1a;Asia/Shanghai、UTC83. 时区&#xff1a;ZoneId、TimeZone4. 时间偏移量&#xff1a;ZoneOffset5. 时区简称&#xff1a;CTT、PRC 二、主要时间类1. 重要时间接口&#xff1a;Temporal2. 时…

测试用例覆盖不全面的解决方法

测试用例覆盖不全面的解决方法 问题分析 在测试用例设计过程中&#xff0c;容易出现思维受限或者需求盲区&#xff0c;我们不可能完全覆盖用户使用的所有场景&#xff0c;编写测试用例的时不可能把所有的场景都能想周全&#xff0c;把所有的场景下的情况都写成测试用例去模拟、…

SLAM论文速递:SLAM—— (2023)Amos-SLAM:一种基于视觉和几何的抗动态双阶段SLAM方法—5.05(1)

论文信息 题目&#xff1a; Amos-SLAM:An Anti-Dynamics Two-stage SLAM Approach Amos-SLAM:一种基于视觉和几何的抗动态双阶段SLAM方法论文地址&#xff1a; https://arxiv.org/pdf/2302.11747.pdf发表期刊&#xff1a; Computer Science > Robotics标签 xxxx 摘要 传统…

图神经网络:在KarateClub数据集上动手实现图神经网络

文章说明&#xff1a; 1)参考资料&#xff1a;PYG官方文档。超链。 2)博主水平不高&#xff0c;如有错误还望批评指正。 3)我在百度网盘上传了这篇文章的jupyter notebook。超链。提取码8888。 文章目录 文献阅读&#xff1a;代码实操&#xff1a; 文献阅读&#xff1a; 参考文…

基于ArkUI框架开发——图片模糊处理的实现

原文&#xff1a;基于ArkUI框架开发——图片模糊处理的实现&#xff0c;点击链接查看更多技术内容。 现在市面上有很多APP&#xff0c;都或多或少对图片有模糊上的设计&#xff0c;所以&#xff0c;图片模糊效果到底怎么实现的呢&#xff1f; 首先&#xff0c;我们来了解下模糊…

面向万物智联的应用框架的思考和探索(中)

原文&#xff1a;面向万物智联的应用框架的思考和探索&#xff08;中&#xff09;&#xff0c;点击链接查看更多技术内容。 应用框架&#xff0c;是操作系统连接开发者生态&#xff0c;实现用户体验的关键基础设施。其中&#xff0c;开发效率和运行体验是永恒的诉求&#xff0c…

【路径规划】基于麻雀搜索算法的栅格法路径规划 机器人路径规划【Matlab代码#21】

文章目录 1. 原始SSA算法2. 机器人路径规划环境创建3. 路径规划模型建立4. 部分代码展示5. 仿真结果展示6. 资源获取方式 1. 原始SSA算法 2. 机器人路径规划环境创建 对机器人工作空间的进行环境建模是机器人路径规划研究的重要前提。栅格法为环境建模提供了一种简洁有效的方法…

法规标准-GB/T 33577标准解读(2017版)

GB/T 33577是做什么的&#xff1f; GB/T 33577全名为智能交通系统-前方车辆碰撞预警系统(FVCWS)-性能要求和测试步骤&#xff0c;其中主要是对FVCWS系统的功能要求、性能要求及测试步骤进行了介绍。由于ISO 15623-2013内容与本法规内容相同&#xff0c;故可沿用此法规内容 FV…

【谷粒商城之消息队列RabbitMQ】

本笔记内容为尚硅谷谷粒商城消息队列RabbitMQ部分 目录 一、概述 二、简介 三、Docker安装RabbitMQ 四、Springboot整合RabbitMQ 1、引入spring-boot-starter-amqp 2、application.yml配置 3、测试RabbitMQ 1. AmqpAdmin-管理组件 2.RabbitTemplate-消息发送处理组件…

Wikidata实操

1. Wikidata 简介 Wikidata 即维基数据&#xff0c;是维基百科的一个项目。个项目已经在维基百科德国分部开始进行&#xff0c;项目完成之后&#xff0c;将会交给维基百科基金会进行操作和维护。&#xff08;具体百度即可&#xff0c;不多赘述&#xff09; 官网&#xff1a;htt…

操作系统考试复习—第三章 优先级倒置 死锁问题

当前OS广泛采用优先级调度算法和抢占方式&#xff0c;然而在系统中存在着影响进程运行的资源从而可能产生"优先级倒置"现象 具体解释为&#xff1a;在原本的调度算法设计中&#xff0c;高优先级进程可以抢占低优先级的CPU资源&#xff0c;先执行高优先级任务。但是存…

【STM32】在使用STM32Cube.IDE时更改时钟频率后代码跳进异常中断

目录 1、前言2、问题与复现办法3、解决的问题的过程 1、前言 这是在项目中无意发现的问题&#xff0c;其实有同样更复杂的工程可以运行&#xff0c;但是后来发现新建一个简单工程反而运行不了了&#xff0c;但是同样更复杂的工程可以运行说明本来同事原来已经不知道在哪里找到…

Vmware安装Kali

需要准备两个东西&#xff0c;kali镜像和VMware软件 下载kali iso 下载界面有三个可选择的 install是安装版&#xff0c;安装使用&#xff1b; Live版可以直接启动运行&#xff1b; netinstaller是网络安装&#xff0c;需要从网络上下载&#xff0c;文件本身只有引导作用&…

Idea Jrebel 报错:Cannot reactivate, offline seat in use ...

Idea Jrebel 报错&#xff1a;Cannot reactivate, offline seat in use ... 一、问题描述 在使用idea Jrebel续期的时候&#xff0c;修改idea激活服务器地址时&#xff0c;遇到报错&#xff1a;Cannot reactivate, offline seat in use. Click Work online in JRebel configura…

基于aspnet个人博客网站dzkf6606程序

系统使用Visual studio.net2010作为系统开发环境&#xff0c;并采用ASP.NET技术&#xff0c;使用C#语言&#xff0c;以SQL Server为后台数据库。 1&#xff0e;系统登录&#xff1a;系统登录是用户访问系统的路口&#xff0c;设计了系统登录界面&#xff0c;包括用户名、密码和…