C语言趣味代码(四)

news2024/11/26 23:51:31

这一篇主要编写几个打字练习的小程序,然后通过这些小程序的实现来回顾复习我们之前学过的知识,然后通过这写打字练习的小程序来提升我们的打字技术和编程技术。

1. 打字练习

1.1 基本打字练习

1.1.1 基本实现

首先我们来制作一个用于计算并显示输入一个字符串所需时间的打字练习软件(在这里我们会用到上一篇博客中的“getputch.h”库):

#include<stdio.h>
#include<ctype.h>
#include<time.h>
#include<string.h>
#include"getputch.h"
int main()
{
	int i;
	char *str = "How do you do?";
	int len = strlen(str);
	clock_t start, end;
	init_getputch();
	printf("请跟着输入。\n");
	printf(" % s\n", str);
	fflush(stdout);
	start = clock();
	for (i = 0; i < len; i++)
	{
		int ch;
		do
		{
			ch = getch();
			if (isprint(ch))
			{
				putch(ch);
				if (ch != str[i])//如果键按错了,把光标往前退一格
					putch('\b');
			}
		} while (ch != str[i]);
	}
	end = clock();
	printf("\n用时%.1f秒。\n", (double)(end - start) / CLOCKS_PER_SEC);
	term_getputch();
	return 0;
}

我们调试一下看看效果:

在这里我们要输入的是指针str指向的字符串“How do you do?”。根据指针和数组的可交换性,字符串内的字符'H','o',’w‘,...’?'可以从前往后依次用str[0],str[1],....str[13]来表示。此外,变量len用于表示字符串str的长度,其初始值为14。现在我们来介绍一下打字练习的主体部分----for语句。这里的for语句把变量i的值按0,1,2....进行增量,同时通过len次循环从头到尾按顺序遍历字符串内的字符。循环过程中每次遍历的字符sr[i]分别是’H‘,'o',...,'?',这些就是要输入的字符。这里的打字练习不接受输错了的字符(在玩家输入正确的字符之前,程序不会移动到下一个字符)。进行这项控制的是do...while语句。首先把输入的字符(getch函数的返回值)赋值给变量ch。字符ch如果是显示字符,就用putch函数来显示(不显示换行符和制表符等不可显示的字符)。如果字符ch不等于要输入的字符str[i],就输入退格符'\b',把光标的位置往前退一格。这项处理是为了能让下一个输入的字符再次显示在同一个位置上。这和上一篇博客中的“寻找重复数字”中的键盘输入处理是相同的原理。完成上述步骤后,对do语句的控制表达式ch!=str[i]进行求值表达。在输入了错误的字符(ch不等于str[i])时,就会开始do语句的循环。

1.1.2 消除已输入的字符

现在我们将程序稍加修改,每次输入正确字符时都会有一个字符消失,后面的字符会跟着前移。我们看下面这段代码:

#include<stdio.h>
#include<tome.h>
#include<string.h>
#include"getputch.h"
int main()
{
	int i;
	char* str = "How do you do?";
	int len = strlen(str);
	clock_t start, end;
	init_getputch();
	printf("请跟着输入。\n");
	start = clock();
	for (i = 0; i < len; i++)
	{
		printf("%s\r", &str[i]);
		fflush(stdout);
		while (getch() != str[i])
			;
	}
	end = clock();
	printf("\r用时%.1f秒。\n", (double)(end - start) / CLOCKS_PER_SEC);
	term_getputch();
	return 0;
}

跟上一个程序相同,除非玩家输入正确的值,否则程序不会移到下一个字符,当玩家正确输入完所有的字符,所有的字符都消失后,程序结束。尽管这里的操作比上一个程序高级了一些,但程序却变短了。for语句的主体仅有两个语句构成。因为变量i的值为0,所以指针&str[i]指向字符’H‘,这样一来画面上就会显示出以str[0]开头的字符串“How do you do?”。程序会在该字符串后紧接着输入空白字符和回车符\r,并把光标返回到本行开头'H'的位置。如果输入的字符(getch函数的返回值)不是str[i],即使输入的字符不是'H',这个while语句就会一直循环下去,知道玩家输入正确的字符,while语句才会结束。至此我们已经知道,通过把要显示的字符串的开始位置逐一向后方错一个,字符串看上去就像被逐个向左侧前移了一样。在字符串后面紧接着显示一个空白字符是为了不让最末尾的字符遗留在画面上。

1.1.3 输入多个字符串

我们来拓展一下上面的程序,让玩家可以在练习时输入多个字符串,输入完一个字符串后,同一行会显示下一个字符串供玩家输入,我们来实现一下:

#include<stdio.h>
#include<time.h>
#include<string.h>
#include"getputch.h"
#define QNO 12
int main()
{
	char* str[QNO] = { "halt","reputation","supportive","junk","global",
	                   "survive","multiple","coat","emphasis",
	                   "capital","drop","novel" };
	int i, stage;
	clock_t start, end;
	init_getputch();
	printf("开始打字练习。\n");
	printf("按下空格开始。\n");
	while (_getch() != ' ')
		;
	start = clock();
	for (stage = 0; stage < QNO; stage++)
	{
		int len = strlen(str[stage]);
		for (i = 0; i < len; i++)
		{
			printf("%s\r", &str[stage][i]);
			fflush(stdout);
			while (_getch() != str[stage][i])
				;
		}
	}
	end = clock();
	printf("\r用时%.1f秒。\n", (double)(end - start) / CLOCKS_PER_SEC);
	term_getputch();
	return 0;
}

有一个要注意的点就是,再上一个程序中,作为指针的str在这里变成了指针数组。元素str[0],str[1]...分别指向了"halt","reputation"...的开头字符"h","r"...的指针,在主体部分使用了两个for语句。因为题目中的单词从1个变成了12个,所以使用了双层for语句,外层的for语句会把变量stage的值从0开始循环QNO次(也就是12次),里面的for语句就相当于上的程序中的for语句,每次循环时要输入的字符串时str[stage](相当于上个程序的str),要输入的字符数量根据字符串的不同而有所差异。内层的for语句每次循环时,要输入的字符是str[stage][i],这里的str[stage][i]相当于上一个程序中的str[i]。

1.1.4 打乱出题顺序 

 用前面的程序反复多练习几次,题目下一个出现的字符串就会浮现在脑海里,从而削弱训练成果,为了把出题顺序打乱,我们有两个方法来打乱顺序。

1.1.4.1 方法1

程序新导入了一个元素类型为int型,元素个数为QNO(题目中的字符串的个数)的数组qno ,在开始练习打字之前通过两个for语句来设定数组qno各个元素的值,第一个for语句从前往后依次赋值0,1,2...11。第二个for语句我们用之前的方法把元素的顺序打乱并重新排列,打字练习的主体部分的for语句和上一个程序基本相同,但str[stage]的地方全部变成str[qno[atge]],这是因为在该程序的各次循环中用于出题的是str[qno[]stage]。我们看下面的实现代码:

#include<stdio.h>
#include<time.h>
#include<time.h>
#include<string.h>
#include"getputch.h"
#define QNO 12
#define swap(type,x,y) do{type t=x;x=y;y=t;}while(0)
int main()
{
	char* str[QNO] = { "halt","reputation","supportive","junk","global",
					   "survive","multiple","coat","emphasis",
					   "capital","drop","novel" };
	int i, stage;
	int qno[QNO];
	clock_t start, end;
	init_getputch();
	srand(time(NULL));
	for (i = 0; i < QNO; i++)
		qno[i] = i;
	for (i = QNO - 1; i > 0; i--)
	{
		int j = rand() % (i + 1);
		if (i != j)
			swap(int, qno[i], qno[j]);
	}
	printf("开始打字练习。\n");
	printf("按下空格开始。\n");
	while (getch() != ' ')
		;
	start = clock();
	for (stage = 0; stage < QNO; stage++)
	{
		int len = strlen(str[qno[stage]]);
		for (i = 0; i < len; i++)
		{
			printf("%s\r", &str[qno[stage]][i]);
			fflush(stdout);
			while (getch() != str[qno[stage]][i])
				;
		}
	}
	end = clock();
	printf("\r用时%.1f秒。\n", (double)(end - start) / CLOCKS_PER_SEC);
	term_getputch();
	return 0;
}
1.1.4.2 方法2  

方法2就是大家最常想到的,重新排列指针,也就是数组str的各个元素的值,这样元素就被打乱了。这个方法有一个缺点:单词打乱顺序后无法恢复原样。 我们来实现一下:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include"getputch.h"
#define QNO 12
#define swap(type,x,y) do{type t=x;x=y;y=t;}while(0)
int main()
{
	char* str[QNO] = { "halt","reputation","supportive","junk","global",
					   "survive","multiple","coat","emphasis",
					   "capital","drop","novel" };
	int i, stage;
	int qno[QNO];
	clock_t start, end;
	init_getputch();
	srand(time(NULL));
	for (i = QNO - 1; i > 0; i--)
	{
		int j = rand() % (i)+1;
		if (i != j)
			swap(char*, str[i], str[j]);
	}
	printf("开始打字练习。\n");
	printf("按下空格开始。\n");
	while (getch() != ' ')
		;
	start = clock();
	for (stage = 0; stage < QNO; stage++)
	{
		int len = strlen(str[stage]);
		for (i = 0; i < len; i++)
		{
			printf("%s\r", &str[stage][i]);
			fflush(stdout);
			while (getch() != str[stage][i])
				;
		}
	}
	end = clock();
	printf("\r用时%.1f秒。\n", (double)(end - start) / CLOCKS_PER_SEC);
	term_getputch();
	return 0;
}

1.2 键盘布局联想打字

现在我们要编写一个稍微有些神奇的小程序,在这个小程序里能训练玩家在没有提示的情况下打出被隐藏的字符。玩家边回忆键盘上每个按键的位置边进行打字练习的软件,跟普通的打字练习不同,玩家需要输入的是没有提示符的字符。不同的键盘有不同的键盘布局,这里我们将键盘分为未按下shift键的状态和按下shift键的状态(这里的键盘我们取字母3层和其上面数字那一层)。关于该键盘的布局我们可以分成以下几个点来看:1.由4层按构成。2.每层分为左手敲击键盘和右手敲击键盘。3.有不需要按shift键敲击的键和需要按shift键敲击的键。这里我们用“?”来隐藏原本是这里的一个字符。我们实现一下这个程序:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include"getputch.h"
#define NO 30      //次数
#define KTYPE 16   //块数
int main()
{
	char* str[] = { "12345","67890-=",
					"!@#$%","^&*()_+",
					"qwert","yuiop[]",
					"QWERT","YUIOP{}",
					"asdfg","hjkl;'\\",
					"ASDFG","HJKL:\"|",
					"zxcvb","nm,./",
					"ZXCVB","NM<>?" };
	int i, stage;
	clock_t start, end;
	init_getputch();
	srand(time(NULL));
	printf("开始键位联想打字练习。\n");
	printf("请输入用?隐藏起来的字符。\n");
	printf("按下空格开始。\n");
	fflush(stdout);
	while (getch() != ' ')
		;
	start = clock();
	for (stage = 0; stage < NO; stage++)
	{
		int k, p, key;
		char temp[10];
		do
		{
			k = rand() % KTYPE;
			p = rand() % strlen(str[k]);
			key = str[k][p];
		} while (key == ' ');
		strcpy(temp, str[k]);
		temp[p] = '?';
		printf("%s",temp);
		fflush(stdout);
		while (getch() != key)
			;
		putchar('\n');
	}
	end = clock();
	printf("用时%.1f秒。\n", (double)(end - start) / CLOCKS_PER_SEC);
	term_getputch();
	return 0;
}

我们看一下效果(这里我没有一直打完,只做了一部分):

变量k表示要用哪个块来出题,因为这个值对应数组str的下标,所以我们将其定义为一个大于等于0小于等于KTYPE的随机数。变量p表示要隐藏块中的哪一个字符来出题,因为这个值对应用于出题的块的字符串的下标,所以我们将其定义为一个大于等于0且小于用于出题的块的字符串数量的随机数。如果能显示出字符串temp,且能读取到从键盘输入的字符key,那么这个程序就对了,这里和之前的程序一样,不接受错误的字符,训练30次后,程序就会自动结束。 

1.3 综合打字练习

现在我们编写一个具备多个练习的菜单,让玩家能够进行综合练习的打字小程序。那我们先来实现一下再进行介绍:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include"getputch.h"
#define NO 15
#define KTYPE 16
#define POS_LEN 10
//练习菜单
typedef enum
{
    Term,
    KeyPos,
    KeyPosComp,
    Clang,
    Conversation,
    InValid
}Menu;
//各个块的键
char* kstr[] = { "12345","67890-=",
               "!@#$%","^&*()_+"
               "qwert","yuiop[]",
               "QWERT","YUIOP{}",
               "asdfg","hjkl;'\\",
               "ASDFG","HJKL:\"|",
               "zxcvb","nm,./",
               "ZXCVB","NM<>?",
};
//C语言的关键字和库
char* cstr[] = { "auto","break","case","char","const","continue",
                "dafault","do","double","else","enum","extern",
                "float","for","goto","if","int","long",
                "register","return","short","signed","sizeof","static",
                "struct","switch","typedef","union","unsigned","void",
                "volatile","while",
                "abort","abs","acos","asctime","asin","assert",
                "atan","atan2","atexit","atof","atoi","atol",
                "baserch","calloc","ceil","clearerr","clock","cos",
                "cosh","ctime","difftime","div","exit","exp",
                "fabs","fclose","feof","ferror","fflush","fgetc",
                "fgetpos","fgets","floor","fmod","fopen","fprintf",
                "fputc","fputs","fread","free","freopen","frexp",
                "fscanf","fseek","fsetpos","ftell","fwrite","getc",
                "getchar","getenv","gets","gmtine","isalnum","isalpha",
                "iscntrl","isdigit","isgraph","islower","isprint","ispunct",
                "isspace","isupper","isxdigit","labs","ldexp","ldiv",
                "localeconv","localtime","log","log10","longjimp",
                "malloc","memchr","memcmp","memcpy","memmove","memset",
                "mktime","modf","perror","pow","printf","putc",
                "putchar","puts","qsort","raise","rand","realloc",
                "remove","rename","rewind","scanf","setbuf","setjmp",
                "setlocale","setvbuf","signal","sin","sinh","sprintf",
                "sqrt","srand","sscanf","strcat","strchr","strcmp",
                "strcoll","strcpy","strcspn","strerror","strftime","strlen",
                "strncat","strncmp","strncpy","strpbrk","strrchr","strspn",
                "strstr","strtod","strtok","strtol","strtoul","strxfrm",
                "system","tan","tanh","time","tmpfile","tmpnam",
                "tolower","toupper","ungetc","va_arg","va_end","va_start",
                "vfprintf","vprintf","vsprintf",
};
//英语对话
char* vstr[] = { "Hello!",
                "How are you?",
                "Fine thanks.",
                "How do you do?",
                "Good bye!",
                "Good morning!",
                "Good afternoon!",
                "Good evening!",
                "See you later!",
                "Go ahead,please.",
                "Thank you.",
                "No,thank you.",
                "May I have your name?",
                "I'm glad to meet you.",
                "What's time is it now?",
                "I must go now.",
                "Where is the restroom?",
                "I don't know.",
                "I have no change with me.",
                "I will be back.",
                "I hope I'm not disturbing you.",
                "Just follow my lead.",
};
//字符串str的打字练习(返回错误次数)
int go(const char* str)
{
    int i;
    int len = strlen(str);
    int mistake = 0;
    for (i = 0; i < len; i++)
    {
        printf("%s\r", &str[i]);
        fflush(stdout);
        while (getch() != str[i])
        {
            mistake++;
        }
    }
    return mistake;
}
//单一位置训练
void pos_traning()
{
    int i;
    int stage;
    int temp, line;
    int len;//用于出题块的键数
    int qno, pno;//题目编号和上一个的题目编号
    int tno, mno;//字符数量和错误次数
    clock_t start, end;
    printf("\n进行单一位置训练。\n");
    printf("请选择要练习的块。\n");
    printf("第一层 (1) 左 %-8s    (2) 右 %-8s\n", kstr[0], kstr[1]);
    printf("第二层 (1) 左 %-8s    (2) 右 %-8s\n", kstr[4], kstr[5]);
    printf("第三层 (1) 左 %-8s    (2) 右 %-8s\n", kstr[8], kstr[9]);
    printf("第四层 (1) 左 %-8s    (2) 右 %-8s\n", kstr[12], kstr[13]);
    do
    {
        printf("编号(停止练习为99): ");
        scanf("%d", &temp);
        if (temp == 99)
            return;
    } while (temp < 1 || temp>8);
    line = 4 * ((temp - 1) / 2) + (temp - 1) % 2;
    printf("练习%d次%s题目。\n",NO, kstr[line]);
    printf("按下空格开始。\n");
    while (getch() != ' ')
        ;
    tno = mno = 0;
    len = strlen(kstr[line]);
    start = clock();
    for (stage = 0; stage < NO; stage++)
    {
        char str[POS_LEN + 1];
        for (i = 0; i < POS_LEN; i++)
            str[i] = kstr[line][rand() % len];
        str[i] = '\0';
        mno += go(str);
        tno += strlen(str);
    }
    end = clock();
    printf("题目:%d字符/错误:%d次\n", tno, mno);
    printf("用时%.1f秒。\n", (double)(end - start) / CLOCKS_PER_SEC);
}
//混合位置训练
void pos_training2()
{
    int i;
    int stage;
    int temp, line;
    int sno;//被选中的块数
    int select[KTYPE];//被选中的块
    int len[KTYPE];//用于出题的块的键数
    int tno, mno;//字符数量和错误次数
    clock_t start, end;
    char* format = "第%d层 (%2d) 左 %-8s (%2d) 右 %-8s"
        "(%2d) [左] %-8s (%2d) [右] %-8s\n";
    printf("\n进行混合位置训练。\n");
    printf("请选择要练习的块(可以多选)。\n");
    for (i = 0; i < 4; i++)
    {
        int k = i * 4;
        printf(format, i + 1, k + 1, kstr[k], k + 2, kstr[k + 1],
            k + 3, kstr[k + 2], k + 4, kstr[k + 3]);
    }
    //不重复选择块
    sno = 0;
    while (1)
    {
        printf("编号(结束选择为50/停止练习为99)。");
        do
        {
            scanf("%d", &temp);
            if (temp == 99)
                return;
        } while ((temp<1 || temp>KTYPE) && temp != 50);
        if (temp == 50)
            break;
        for (i = 0; i < sno; i++)
            if (temp == select[i])
            {
                printf("\a这一层已经被选过了。\n");
                break;
            }
        if (i == sno)
            select[sno++] = temp;
    }
    if (sno == 0)
        return;//一个都没选
    printf("把下列块的题目练习%d次。\n", NO);
    for (i = 0; i < sno; i++)
        printf("%s", kstr[select[i] - 1]);
    printf("\n按下空格开始。\n");
    while (getch() != ' ')
        ;
    tno = mno = 0;//清空字符数量和错误次数
    for (i = 0; i < sno; i++)
        len[i] = strlen(kstr[select[i] - 1]);
    start = clock();
    for (stage = 0; stage < NO; stage++)
    {
        char str[POS_LEN + 1];
        for (i = 0; i < POS_LEN; i++)
        {
            int q = rand() % sno;
            str[i] = kstr[select[q] - 1][rand() % len[q]];
        }
        str[i] = '\0';       
        mno += go(str);
        tno += strlen(str);
    }
    end = clock();
    printf("题目:%d字符/错误:%d次\n", tno, mno);
    printf("用时%.1f秒。\n", (double)(end - start) / CLOCKS_PER_SEC);
}
//C语言/英语会话训练
void word_training(const char* mes, const char* str[], int n)
{
    int stage;
    int qno, pno;
    int tno, mno;
    clock_t start, end;
    printf("\n练习%d个%s。\n", NO, mes);
    printf("按下空格开始。\n");
    while (getch() != ' ')
        ;
    tno = mno = 0;
    pno = n;
    start = clock();
    for (stage = 0; stage < NO; stage++)
    {
        do
        {
            qno = rand() % n;            
            mno += go(str[qno]);
            tno += strlen(str[qno]);
        } while (qno ==pno);
        pno = qno;
    }
    end = clock();
    printf("题目:%d字符/错误:%d次\n", tno, mno);
    printf("用时%.1f秒。\n", (double)(end - start) / CLOCKS_PER_SEC);
}
//选择菜单
Menu Selectmenu()
{
    int ch;
    do
    {
        printf("\n请选择练习。\n");
        printf("(1)单一位置        (2)混合位置\n");
        printf("(3)C语言的的单词   (4)英语会话    (0)退出:");
        scanf("%d", &ch);
    } while (ch < Term || ch >= InValid);
    return (Menu)ch;
}
int main()
{
    Menu menu;
    int cn = sizeof(cstr) / sizeof(cstr[0]);
    int vn = sizeof(vstr) / sizeof(vstr[0]);
    init_getputch();
    srand(time(NULL));
    do
    {
        switch (menu = Selectmenu())
        {
        case KeyPos:
            pos_traning();
            break;
        case KeyPosComp:
            pos_training2();
            break;
        case Clang:
            word_training("C语言单词", cstr, cn);
            break;
        case Conversation:
            word_training("英语会话文档", vstr, vn);
            break;
        }
    } while (menu != Term);
    term_getputch();
    return 0;
}

我们实现一下看看效果:

 函数SelectMenu用于显示训练的菜单,供练习者选择,该函数会从键盘读取0~4的整数值,把该值转换成枚举类型Menu的值然后返回。

单一位置训练是把一个块内的键组合起来供玩家练习的程序,首先,玩家需要选择练习哪个块,用于出题的字符串的元素下标是0,1,4,5,8,9,12,13,而作为选项显示在画面上,由练习者从键盘输入的块的编号是1,2,3,4,5,6,7,8。下面这段代码用于把从键盘读取到的值1~8转换为下标:

line=4*((temp-1)/2)+(temp-1)%2;

把通过右边计算的值赋值给变量line。这个值用于出题的块的下标。变量len用于表示被选中的块的字符串kstr[line]的字符数量。每次生成每次用于出题的字符串str时,从字符串kstr[line]中随机取出字符,然后赋值给str[0]~str[9],空字符赋值给str[POS_LEN]。生成题目后,程序就会调用go函数,这个函数负责显示接收到的字符串str,以供玩家进行打字练习,每次玩家输入错误时,变量mistake的值就会被增量,输入结束后,函数就会返回输入错误的次数。混合位置训练是在单一位置训练的基础上,将多个块的键进行组合练习,让练习者可以根据自己的喜好来组合。

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

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

相关文章

React | React.cloneElement 的使用

我看到同事的代码里有 cloneElement&#xff0c;于是去了解了一下这个函数。 就跟它的名字一样&#xff0c;克隆元素&#xff0c;可以基于一个元素创建一个新的元素&#xff0c;并且为新元素添加新的属性或者覆盖已有的属性。 下面是一个简单例子&#xff1a; .node1 {backg…

2024最新docker部署gitlab

docker部署gitlab 快速命令 1 拉取镜像 docker pull gitlab/gitlab-ce2 启动容器 docker run -itd \-p 9980:80 \-p 9922:22 \-v /opt/soft/docker/gitlab/etc:/etc/gitlab \-v /opt/soft/docker/gitlab/log:/var/log/gitlab \-v /opt/soft/docker/gitlab/opt:/var/opt/g…

MATLAB语音信号分析与合成——MATLAB语音信号分析学习资料汇总(图书、代码和视频)

教科书&#xff1a;MATLAB语音信号分析与合成&#xff08;第2版&#xff09; 链接&#xff08;含配套源代码&#xff09;&#xff1a;https://pan.baidu.com/s/1pXMPD_9TRpJmubPGaRKANw?pwd32rf 提取码&#xff1a;32rf 基础入门视频&#xff1a; 视频链接&#xff1a; 清…

为什么我的Mac运行速度变慢 mac运行速度慢怎么办 如何使用CleanMyMac X修复它

近些年伴随着苹果生态的蓬勃发展&#xff0c;越来越多的用户开始尝试接触Mac电脑。然而很多人上手Mac后会发现&#xff0c;它的使用逻辑与Windows存在很多不同&#xff0c;而且随着使用时间的增加&#xff0c;一些奇奇怪怪的文件也会占据有限的磁盘空间&#xff0c;进而影响使用…

红黑树笔记

2-3树 -> 左倾红黑树 红黑树实际上是2-3树的一种基于BST的实现。普通二叉搜索树&#xff08;BST&#xff09;中的每一个节点&#xff0c;只有一个键&#xff0c;两条链接&#xff08;两个子节点&#xff09;&#xff0c;这种节点被称为2节点。2-3树中&#xff0c;引入了一个…

利用二叉检索树将文章中的单词建立索引(正则表达式)

知识储备 链接: 【二叉检索树的实现——增删改查、读取命令文件、将结果写入新文件】 1、正则表达式的处理 &#xff08;1&#xff09;r’前缀的作用 r’前缀的用于定义原始字符串&#xff0c;特点是不会处理反斜杠\作为转义字符 &#xff08;2&#xff09;正则表达式中元…

335GB,台北地区倾斜摄影OSGB数据V0.2版介绍!

前几天发布了台北地区倾斜摄影OSGB数据第一个版本(139GB,台北倾斜摄影OSGB数据V0.1版),虽然数据还是一个半成品&#xff0c;完全没想到热度很高&#xff0c;很多读者对这份数据都有比较浓厚的兴趣&#xff0c;在这里首先感谢各位读者的大力支持与鼓励&#xff0c;给了我持续更新…

Arm Linux 移植 Air724UG 4G模块-USB方式

目录 一、开发环境二、连接方式三、4G模组的 VID 和 PID四、Linux kernel 的配置五、ppp的编译六、测试 一、开发环境 开发板&#xff1a;NUC980 iot开发板 4G模块&#xff1a;银尔达 Core-Air724 二、连接方式 micro usb线&#xff0c;一端连接4G模组&#xff0c;一端连接N…

亚马逊云科技AWS将推出数据工程师全新认证(有资料)

AWS认证体系最近更新&#xff0c;在原有12张的基础上&#xff0c;将在2023年11月27日添加第13张&#xff0c;数据工程师助理级认证(Data Engineer Associate)&#xff0c;并且在2024/1/12前半价(省75刀&#xff1d;544人民币。 原有的数据分析专家级认证(Data Analytics Specia…

Spark-机器学习(7)分类学习之决策树

在之前的文章中&#xff0c;我们学习了分类学习之支持向量机&#xff0c;并带来简单案例&#xff0c;学习用法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。…

java-链表排序

需求 思路 排序&#xff1a;讲所有的值都取出来&#xff0c;存储到ArrayList中&#xff0c;然后排序&#xff0c;将排序之后的元素依次使用add方法添加到自定义链表合并排序&#xff1a;先合并&#xff0c;然后调用刚才写的排序算法合并&#xff1a;将表一的头结点作为新链表的…

kerberos-hive-dbeaver问题总结

一、kerberos安装windows客户端 1、官方下载地址 http://web.mit.edu/kerberos/dist/ 2、环境变量配置 下载msi安装包&#xff0c;无需重启计算机&#xff0c;调整环境变量在jdk的前面&#xff0c;尽量靠前&#xff0c;因为jdk也带了kinit、klist等命令 C:\Program Files\…

[动画+注释详解]数据结构 - 直接插入排序

一. 直接插入排序算法的实现 1.1 基本思想 直接插入排序&#xff08;Straight Insertion Sort&#xff09;是一种简单直观的排序算法&#xff0c;它的基本思想是将一个待排序的记录插入到已经排序好的有序表中&#xff0c;从而得到一个新的、记录数增加1的有序表。 实际中&am…

Oracle对空值(NULL)的 聚合函数 排序

除count之外sum、avg、max、min都为null&#xff0c;count为0 Null 不支持加减乘除&#xff0c;大小比较&#xff0c;相等比较&#xff0c;否则只能为空&#xff1b;只能用‘is [not] null’来进行判断&#xff1b; Max等聚合函数会自动“过滤null” null排序默认最大&#xf…

特别的时钟特别的倒计时

念念不忘的歌曲&#xff1a;Thats Why You Go Away <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&…

线上线下交友社区系统,支持打包小程序/公众号/H5,源码交付!

上网交友的好处有很多&#xff0c;以下是一些主要的好处&#xff1a; 1. 拓展人际关系&#xff1a;通过上网交友可以认识更多的人&#xff0c;拓展自己的社交圈。这有助于扩大自己的视野、增加人生经验和开阔心胸。 2. 找到志同道合的朋友&#xff1a;在网络上&#xff0c;我们…

《面向云计算的零信任体系第1部分:总体架构》行业标准正式发布

中华人民共和国工业和信息化部公告2024年第4号文件正式发布行业标准&#xff1a;YD/T 4598.1-2024《面向云计算的零信任体系 第1部分&#xff1a;总体架构》&#xff08;后简称“总体架构”&#xff09;&#xff0c;并于2024年7月1日正式施行。 该标准由中国信通院牵头&#xf…

装饰器模式、代理模式、适配器模式对比

装饰器模式、代理模式和适配器模式都是结构型设计模式&#xff0c;它们的主要目标都是将将类或对象按某种布局组成更大的结构&#xff0c;使得程序结构更加清晰。这里将装饰器模式、代理模式和适配器模式进行比较&#xff0c;主要是因为三个设计模式的类图结构相似度较高、且功…

如何讲好ppt演讲技巧(4篇)

如何讲好ppt演讲技巧&#xff08;4篇&#xff09; 如何讲好PPT演讲技巧&#xff08;四篇&#xff09; **篇&#xff1a;精心准备&#xff0c;奠定演讲基础 一个成功的PPT演讲&#xff0c;离不开精心的准备。首先&#xff0c;要确定演讲的主题和目标&#xff0c;确保演讲内容清…

SpringMVC进阶(自定义拦截器以及异常处理)

文章目录 1.自定义拦截器1.基本介绍1.说明2.自定义拦截器的三个方法3.流程图 2.快速入门1.Myinterceptor01.java2.FurnHandler.java3.springDispatcherServlet-servlet.xml配置拦截器4.单元测试 3.拦截特定路径1.拦截指定路径2.通配符配置路径 4.细节说明5.多个拦截器1.执行流程…