C Primer Plus第十三章编程练习答案

news2024/11/30 2:44:14

学完C语言之后,我就去阅读《C Primer Plus》这本经典的C语言书籍,对每一章的编程练习题都做了相关的解答,仅仅代表着我个人的解答思路,如有错误,请各位大佬帮忙点出!

由于使用的是命令行参数常用于linux系统或者vscode,但此代码是运行于vs2022的,测试截图就不弄了。

1.修改程序清单13.1中的程序,要求提示用户输入文件名,并读取用户 输入的信息,不使用命令行参数。

#include <stdio.h>
#include <stdlib.h>
#define LEN 50
int main(int argc, char* argv[])
{
    int ch;
    FILE* fp;
    int count = 0;
    char filename[LEN];

    printf("Please enter a filename: ");
    scanf("%s", filename);

    fp = fopen(filename, "r");
    if (fp == NULL)
    {
        printf("Can't open %s\n", filename);
        exit(0);
    }
    while ((ch = getc(fp)) != EOF)
    {
        putc(ch, stdout);
        count++;
    }
    fclose(fp);
    printf("\nFile %s has %d characters\n", filename, count);

    return 0;
}

2.编写一个文件拷贝程序,该程序通过命令行获取原始文件名和拷贝文 件名。尽量使用标准I/O和二进制模式。

#include <stdio.h>
#include <stdlib.h>
#define BUF 512
int main(int argc, char* argv[])
{
    int bytes;
    FILE* source;
    FILE* target;
    char temp[BUF];

    if ((source = fopen("test.txt", "rb")) == NULL)
    {
        printf("Can't open %s\n", "test.txt");
        exit(0);
    }
    if ((target = fopen("copy.txt", "wb")) == NULL)
    {
        printf("Can't open %s\n", "copy.txt");
        exit(0);
    }
    while ((bytes = fread(temp, sizeof(char), BUF, source)) > 0)
    {
        fwrite(temp, sizeof(char), bytes, target);
    }

    fclose(source);
    fclose(target);
    
    return 0;
}

3.编写一个文件拷贝程序,提示用户输入文本文件名,并以该文件名作 为原始文件名和输出文件名。该程序要使用 ctype.h 中的 toupper()函数,在 写入到输出文件时把所有文本转换成大写。使用标准I/O和文本模式。

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#define LEN 50
int main(int argc, char* argv[])
{
    int ch;
    FILE* fp;
    char filename[LEN];

    printf("Please enter a filename: ");
    scanf("%s", filename);
    fp = fopen(filename, "r+");
    if (fp == NULL)
    {
        printf("Can't open %s\n", filename);
        exit(0);
    }
    while ((ch = getc(fp)) != EOF)
    {
        fseek(fp, -1L, SEEK_CUR);
        putc(toupper(ch), fp);
        fseek(fp, 0L, SEEK_CUR); 
    rewind(fp);
    printf("File %s:\n", filename);
    while ((ch = getc(fp)) != EOF)
    {
        putchar(ch);
    }
    printf("\n");

    fclose(fp);

    return 0;
}

4.编写一个程序,按顺序在屏幕上显示命令行中列出的所有文件。使用 argc控制循环。

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
    int i, temp;
    FILE* source;

    if (argc == 1)
    {
        printf("Usage: %s filename[s]\n", argv[0]);
        exit(0);
    }
    for (i = 1; i < argc; i++)
    {
        source = fopen(argv[i], "r");
        if (source == NULL)
        {
            printf("Can't open file %s\n", argv[i]);
            continue;
        }
        printf("File %s:\n", argv[i]);
        while ((temp = getc(source)) != EOF)
        {
            putchar(temp);
        }
        printf("\n");
        fclose(source);
    }

    return 0;
}

5.修改程序清单13.5中的程序,用命令行界面代替交互式界面。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFSIZE 4096
#define SLEN 81
void append(FILE* source, FILE* dest)
{
    size_t bytes;
    static char temp[BUFSIZE];
    while ((bytes = fread(temp, sizeof(char), BUFSIZE, source)) > 0)
    {
        fwrite(temp, sizeof(char), bytes, dest);
    }
    return;
}
int main(int argc, char* argv[])
{
    int i, ch;
    int files = 0;
    FILE* fa;
    FILE* fs;

    if (argc < 3)
    {
        printf("Usage: %s appendfile sourcefile.\n", argv[0]);
        exit(0);
    }
    if ((fa = fopen(argv[1], "a+")) == NULL)
    {
        printf("Can't open %s\n", argv[1]);
        exit(0);
    }
    if (setvbuf(fa, NULL, _IOFBF, BUFSIZE) != 0)
    {
        fputs("Can't create output buffer\n", stderr);
        exit(0);
    }
    for (i = 2; i < argc; i++)
    {
        if (strcmp(argv[i], argv[1]) == 0)
        {
            fputs("Can't append file to itself\n", stderr);
        }
        else if ((fs = fopen(argv[i], "r")) == NULL)
        {
            printf("Can't open %s\n", argv[i]);
        }
        else
        {
            if (setvbuf(fs, NULL, _IOFBF, BUFSIZE) != 0)
            {
                fputs("Can't create input buffer\n", stderr);
                continue;
            }
            append(fs, fa);
            if (ferror(fs) != 0)
            {
                printf("Error in reading file %s.\n", argv[i]);
            }
            if (ferror(fa) != 0)
            {
                printf("Error in writing file %s.\n", argv[1]);
            }
            fclose(fs);
            files++;
            printf("File %s appended.\n", argv[i]);
        }
    }
    printf("Done appending. %d files appended.\n", files);
    rewind(fa); 
    printf("%s contents:\n", argv[1]);
    while ((ch = getc(fa)) != EOF)
    {
        putchar(ch);
    }
    printf("\n");
    printf("Done displaying.");
    fclose(fa);

    return 0;
}

6.使用命令行参数的程序依赖于用户的内存如何正确地使用它们。重写 程序清单 13.2 中的程序,不使用命令行参数,而是提示用户输入所需信 息。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 40
int main(int argc, char* argv[])
{
    FILE* in, * out;
    int ch;
    char name[LEN];
    int count = 0;
    char temp[LEN];

    printf("Please enter a filename:\n");
    scanf("%s", temp);
    in = fopen(temp, "r");
    if (in == NULL)
    {
        printf("I could't open the file \"%s\"\n", temp);
        exit(0);
    }
    strncpy(name, temp, LEN - 5);
    name[LEN - 5] = '\0';
    strcat(name, ".red");
    out = fopen(name, "w");
    if (out == NULL)
    {
        printf("Can't create output file.\n");
        exit(1);
    }
    while ((ch = getc(in)) != EOF)
    {
        if (count++ % 3 == 0)
        {
            putc(ch, out);
        }
    }
    fclose(in);
    fclose(out);

    return 0;
}

7.编写一个程序打开两个文件。可以使用命令行参数或提示用户输入文 件名。

a.该程序以这样的顺序打印:打印第1个文件的第1行,第2个文件的第1 行,第1个文件的第2行,第2个文件的第2行,以此类推,打印到行数较多文 件的最后一行。

b.修改该程序,把行号相同的行打印成一行。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LEN 256
int main(int argc, char* argv[])
{
    FILE* f1;
    FILE* f2;
    char str1[LEN], str2[LEN];

    printf("请输入两个文件的名字:");
    scanf("%s %s", str1, str2);
    f1 = fopen(str1, "r");
    if (f1 == NULL)
    {
        printf("Can't open file %s\n", str1);
        exit(0);
    }
    f2 = fopen(str2, "r");
    if (f2 == NULL)
    {
        printf("Can't open file %s\n", str2);
        exit(0);
    }

    char* s1 = fgets(str1, LEN, f1);
    char* s2 = fgets(str2, LEN, f2);
    while (s1 || s2)
    {
        int len1 = strlen(str1), len2 = strlen(str2);
        if (str1[len1 - 1] == '\n')
        {
            str1[len1 - 1] = '\0';
        }
        if (str2[len2 - 1] == '\n')
        {
            str2[len2 - 1] = '\0';
        }
        if (s1)
        {
            printf("%s\n", str1);
        }
        if (s2)
        {
            printf("%s\n", str2);
        }
        s1 = fgets(str1, LEN, f1), s2 = fgets(str2, LEN, f2);
    }
    fclose(f1);
    fclose(f2);

    return 0;
}

8.编写一个程序,以一个字符和任意文件名作为命令行参数。如果字符 后面没有参数,该程序读取标准输入;否则,程序依次打开每个文件并报告 每个文件中该字符出现的次数。文件名和字符本身也要一同报告。程序应包 含错误检查,以确定参数数量是否正确和是否能打开文件。如果无法打开文件,程序应报告这一情况,然后继续处理下一个文件。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int search(int ch, FILE* fp)
{
    int find;
    int n = 0;

    while ((find = getc(fp)) != EOF)
    {
        if (ch == find)
        {
            ++n;
        }
    }
    return n;
}
int main(int argc, char* argv[])
{
    FILE* fp;
    int i, ch, ct;
    int count = 0;

    if (argc < 2)
    {
        printf("Usage: %s character filename[s]\n", argv[0]);
        exit(-1);
    }
    if (strlen(argv[1]) != 1)
    {
        printf("The second argument must be a character!\n");
        exit(-1);
    }
    if (argc == 2)
    {
        fp = stdin;
        ch = argv[1][0];
        printf("Please enter a string (EOF to quit): ");
        count = search(ch, fp);
        printf("%c appeared %d times.\n", ch, count);
    }
    else if (argc > 2)
    {
        ch = argv[1][0];
        for (i = 2; i < argc; i++)
        {
            if ((fp = fopen(argv[i], "r")) == NULL)
            {
                printf("Can't open file %s\n", argv[i]);
                continue;
            }
            printf("File %s:\n", argv[i]);
            while ((ct = getc(fp)) != EOF)
            {
                putchar(ct);
            }
            rewind(fp);
            count = search(ch, fp);
            printf("%c appeared %d times in file %s\n", ch, count, argv[i]);
            fclose(fp);
        }
    }

    return 0;
}

9.修改程序清单 13.3 中的程序,从 1 开始,根据加入列表的顺序为每个 单词编号。当程序下次运行时,确保新的单词编号接着上次的编号开始。

#include <stdio.h>
#include <stdlib.h>
#define MAX 41
int main(void)
{
    FILE* fp;
    int ct = 0;
    char words[MAX];

    fp = fopen("wordy.txt", "a+");
    if ( fp == NULL)
    {
        printf("Can't open \"wordy\" file.\n");
        exit(-1);
    }

    while (fgets(words, MAX, fp) != NULL)
    {
        ct++;
    }
    rewind(fp);
    printf("Enter words to add to the file; press the #\n");
    printf("key at the beginning of a line to terminate.\n");
    while ((fscanf(stdin, "%s", words) == 1) && (words[0] != '#'))
    {
        fprintf(fp, "%-2d : %s\n", ++ct, words);
    }

    printf("File contents:");
    rewind(fp);
    while (fgets(words, MAX, fp) != NULL)
    {
        fputs(words, stdout);
    }
    printf("Done!\n");
    fclose(fp);

    return 0;
}

10.编写一个程序打开一个文本文件,通过交互方式获得文件名。通过 一个循环,提示用户输入一个文件位置。然后该程序打印从该位置开始到下 一个换行符之前的内容。用户输入负数或非数值字符可以结束输入循环。

#include <stdio.h>
#include <stdlib.h>
#define LEN 50

int main(int argc, char* argv[])
{
    int ch;
    FILE* fp;
    int number;
    char filename[LEN];

    printf("Please enter a filename: ");
    scanf("%49s", filename);

    fp = fopen(filename, "r");
    if ( fp == NULL)
    {
        printf("Can't open file %s\n", filename);
        exit(-1);
    }
    printf("Please enter a file position (<0 or q to quit): ");
    while (scanf("%d", &number) == 1 && number >= 0)
    {
        fseek(fp, number, SEEK_SET);
        while ((ch = getc(fp)) != '\n' && ch != EOF)
        {
            putchar(ch);
        }
        if (ch == EOF)
        {
            printf("The position reaches EOF.\n");
            break;
        }
        printf("\nYou can enter again (<0 or q to quit): ");
    }
    printf("Done.\n");
    fclose(fp);

    return 0;
}

11.编写一个程序,接受两个命令行参数。第1个参数是一个字符串,第 2个参数是一个文件名。然后该程序查找该文件,打印文件中包含该字符串 的所有行。因为该任务是面向行而不是面向字符的,所以要使用fgets()而不 是getc()。使用标准C库函数strstr()(11.5.7节简要介绍过)在每一行中查找 指定字符串。假设文件中的所有行都不超过255个字符。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SLEN 256
int main(int argc, char* argv[])
{
    FILE* fp;
    char line[SLEN];

    if (argc != 3)
    {
        printf("Usage: %s string filename\n", argv[0]);
        exit(-1);
    }
    if ((fp = fopen(argv[2], "r")) == NULL)
    {
        printf("Can't open file %s", argv[2]);
        exit(-1);
    }
    while (fgets(line, SLEN, fp) != NULL)
    {
        if (strstr(line, argv[1]) != NULL)
        {
            fputs(line, stdout);
        }
    }
    fclose(fp);

    return 0;
}

12.创建一个文本文件,内含20行,每行30个整数。这些整数都在0~9 之间,用空格分开。该文件是用数字表示一张图片,0~9表示逐渐增加的灰 度。编写一个程序,把文件中的内容读入一个20×30的int数组中。一种把这 些数字转换为图片的粗略方法是:该程序使用数组中的值初始化一个20×31 的字符数组,用值0 对应空格字符,1 对应点字符,以此类推。数字越大表 示字符所占的空间越大。例如,用#表示9。每行的最后一个字符(第31个) 是空字符,这样该数组包含了20个字符串。最后,程序显示最终的图片 (即,打印所有的字符串),并将结果储存在文本文件中。例如,下面是开 始的数据:

 

 

#include <stdio.h>
#include <stdlib.h>
#define ROWS 20
#define COLS 30
#define LEVELS 10
#define LEN 50
const char trans[LEVELS + 1] = " .':~*=&%#"; 
void change(int(*a)[COLS], char(*b)[COLS], int rows)
{
    int row, col;

    for (row = 0; row < ROWS; row++)
    {
        for (col = 0; col < COLS; col++)
        {
            b[row][col] = trans[a[row][col]];
        }
    }
}
int main(void)
{
    int row, col;
    FILE* infile;
    char filename[LEN];
    int figure[ROWS][COLS];
    char picture[ROWS][COLS];

    printf("Please enter a filename: ");
    scanf("%s", filename);

    infile = fopen(filename, "r+");
    if ( infile == NULL)
    {
        printf("Can't open file %s\n", filename);
        exit(-1);
    }
    for (row = 0; row < ROWS; row++)
    {
        for (col = 0; col < COLS; col++)
        {
            fscanf(infile, "%d", &figure[row][col]);
        }
    }

    change(figure, picture, ROWS);
    printf("File %s have been transformed pictures:\n", filename);
    for (row = 0; row < ROWS; row++)
    {
        for (col = 0; col < COLS; col++)
        {
            putchar(picture[row][col]);
        }
        printf("\n");
    }

    fseek(infile, 0L, SEEK_END);
    putc('\n', infile);      
    for (row = 0; row < ROWS; row++)
    {
        for (col = 0; col < COLS; col++)
        {
            fprintf(infile, "%c", picture[row][col]);
        }
        putc('\n', infile);
    }
    fclose(infile);

    return 0;
}

13.用变长数组(VLA)代替标准数组,完成编程练习12。

#include <stdio.h>
#include <stdlib.h>
#define ROWS 20
#define COLS 30
#define LEVELS 10
#define LEN 50
const char trans[LEVELS + 1] = " .':~*=&%#";
void change(int rows, int cols, int a[rows][cols], char b[rows][cols])
{
    int row, col;

    for (row = 0; row < rows; row++)
    {
        for (col = 0; col < cols; col++)
        {
            b[row][col] = trans[a[row][col]];
        }
    }
    return;
}
int main(void)
{
    int row, col;
    FILE* infile;
    char filename[LEN];
    int figure[ROWS][COLS];
    char picture[ROWS][COLS];

    printf("Please enter a filename: ");
    scanf("%s", filename);

    infile = fopen(filename, "r+");
    if ( infile == NULL)
    {
        printf("Can't open file %s\n", filename);
        exit(-1);
    }
    for (row = 0; row < ROWS; row++)
    {
        for (col = 0; col < COLS; col++)
        {
            fscanf(infile, "%d", &figure[row][col]);
        }
    }

    change(ROWS, COLS, figure, picture);
    printf("File %s have been transformed pictures:\n", filename);
    for (row = 0; row < ROWS; row++)
    {
        for (col = 0; col < COLS; col++)
        {
            putchar(picture[row][col]);
        }
        printf("\n");
    }

    fseek(infile, 0L, SEEK_END);
    putc('\n', infile);     
    for (row = 0; row < ROWS; row++)
    {
        for (col = 0; col < COLS; col++)
        {
            fprintf(infile, "%c", picture[row][col]);
        }
        putc('\n', infile);
    }
    fclose(infile);

    return 0;
}

14.数字图像,尤其是从宇宙飞船发回的数字图像,可能会包含一些失 真。为编程练习12添加消除失真的函数。该函数把每个值与它上下左右相邻 的值作比较,如果该值与其周围相邻值的差都大于1,则用所有相邻值的平 均值(四舍五入为整数)代替该值。注意,与边界上的点相邻的点少于4 个,所以做特殊处理。

#include <stdio.h>
#include <stdlib.h>
#define ROWS 20
#define COLS 30
#define LEVELS 10
#define LEN 50
const char trans[LEVELS + 1] = " .':~*=&%#";
int clean_distortion(int(*a)[COLS], int rows, int x, int y)
{
    int i = 0, average = 0, cnt = 0, sur = 0;
    int d[4][2] = { {0, 1}, {1, 0}, {0, -1}, {-1, 0} };
    for (i = 0; i < 4; ++i)
    {
        int dx = x + d[i][0], dy = y + d[i][1];
        if (dx < 0 || dx >= ROWS || dy < 0 || dy >= COLS) continue;
        ++sur;
        if (a[x][y] - a[dx][dy] > 1)
        {
            ++cnt, average += a[dx][dy];
        }
    }
    if (cnt != sur) return a[x][y];
    return 1.0 * average / cnt + 0.5;
}
void change(int(*a)[COLS], char(*b)[COLS], int rows)
{
    int row, col;

    for (row = 0; row < ROWS; row++)
    {
        for (col = 0; col < COLS; col++)
        {
            b[row][col] = trans[a[row][col]];
        }
    }
}
int main(void)
{
    int row, col;
    FILE* infile;
    char filename[LEN];
    int figure[ROWS][COLS];
    char picture[ROWS][COLS];

    printf("Please enter a filename: ");
    scanf("%s", filename);

    infile = fopen(filename, "r+");
    if ( infile == NULL)
    {
        printf("Can't open file %s\n", filename);
        exit(-1);
    }
    for (row = 0; row < ROWS; row++)
    {
        for (col = 0; col < COLS; col++)
        {
            fscanf(infile, "%d", &figure[row][col]);
        }
    }
    for (row = 0; row < ROWS; row++)
    {
        for (col = 0; col < COLS; col++)
        {
            figure[row][col] = clean_distortion(figure, ROWS, row, col);
        }
    }
    change(figure, picture, ROWS);
    printf("File %s have been transformed pictures:\n", filename);
    for (row = 0; row < ROWS; row++)
    {
        for (col = 0; col < COLS; col++)
        {
            putchar(picture[row][col]);
        }
        printf("\n");
    }

    fseek(infile, 0L, SEEK_END);
    putc('\n', infile);
    for (row = 0; row < ROWS; row++)
    {
        for (col = 0; col < COLS; col++)
        {
            fprintf(infile, "%c", picture[row][col]);
        }
        putc('\n', infile);
    }
    fclose(infile);

    return 0;
}

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

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

相关文章

机器学习-5 朴素贝叶斯算法

朴素贝叶斯算法 算法概述数理统计学处理的信息古典学派和贝叶斯学派的争论贝叶斯定理朴素贝叶斯分类训练朴素贝叶斯&#xff1a;朴素假设案例&#xff1a;预测打网球拉普拉斯平滑技术小结 算法流程与步骤算法应用sklearn中的朴素贝叶斯朴素贝叶斯的使用算法实例 算法概述 数理…

年营收超1700亿元 中国机器人行业走向更多场景

文 | BFT机器人 中国已经连续九年成为全球最大的工业机器人应用国&#xff0c;同时还是全球机器人第一生产大国&#xff0c;2022年机器人全行业营收超过1700亿元(人民币&#xff0c;下同)。随着《“机器人”应用行动实施方案》的落地&#xff0c;机器人应用的深度和广度加速扩…

网络安全渗透测试常用术语总结!建议收藏!

肉鸡 肉鸡指的就是被黑客成功入侵并取得控制权限的电脑。黑客们可以随意的控制肉鸡&#xff0c;就像在使用自己的电脑一样&#xff0c;很形象的比喻&#xff0c;就像是养的肉鸡&#xff0c;任黑客宰杀和利用。关键的是&#xff0c;在成为肉鸡后&#xff0c;只要黑客不对电脑进…

Vue打包后chunk-vendors.92223bd2.js文件过大解决方案

唠嗑部分 事情的经过是这样的&#xff0c;最近自己玩了一个小系统&#xff0c;使用的是SpringBootVue编写&#xff0c;打包部署后发现页面加载缓慢&#xff0c;打开控制台一看&#xff0c;发现是这家伙在作祟&#xff0c;请看下图 什么鬼&#xff0c;这个js文件2.6M&#xff0…

error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include “pch.h“

今天创建一个静态库时&#xff0c;编译器报错&#xff1a;error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include “pch.h” 网上查找了各种解决方案&#xff0c;主要是以下两种解决方案&#xff1a; 解决方式&#xff1a; 一. 在解决方案资源…

数据结构与算法07:高效的排序算法

目录 归并排序 快速排序 桶排序 计数排序 基数排序 对比各类排序算法 每日一练&#xff1a;排序链表 在上一篇文章中分析了简单的三种排序算法&#xff1a;冒泡排序、插入排序、选择排序&#xff0c;这三种排序算法的时间复杂度都是O(n^2)&#xff0c;效率不是很高。如果…

KUC711AE101 3BHB004661R0101 用于精确误差仿真的设备

KUC711AE101 3BHB004661R0101 最近推出的欧姆龙自动化产品包括CJ2H-CPU可编程自动化控制器、NS15超清晰15英寸HMI以及用于CJ和CS平台的基于PLC的高速位置控制器模块。通过以太网/IP使用CJ2H-CPU的行业标准、基于标记的编程有助于缩短程序开发时间和故障排除。CX-One有助于满足市…

分布式时序数据库DolphinDB

简介 DolphinDB不仅可作为分布式数据仓库或者内存数据库来使用&#xff0c;而且自带丰富的计算工具&#xff0c;可作为一个研究工具或研究平台来使用。DolphinDB对时间序列数据的处理特别友好&#xff0c;非常适合量化金融、物联网等领域的海量数据分析。例如在量化金融领域的交…

JavaEE进阶(5/29)Mybatis

目录 1.什么是Mybatis 2.Mybatis组成部分 3.配置Mybatis中的存放路径 4.设置路径 6.yml配置MyBatis的xml配置文件路径 1.什么是Mybatis 它是一款持久层框架&#xff0c;支持自定义SQL&#xff0c;存储过程&#xff08;一个方法&#xff0c;封装了一堆SQL&#xff08;包括判断/变…

spring security实现authorization code模式,自定义登录页面,自动授权,自定义密码编码,跳转登录页面http转https

spring security实现authorization code模式# 系列文章目录 SpringSecurity实现OAuth2 JWT和OAuth2在SpringBoot下的实现 spring security实现authorization code模式 摘要自定义登录页面自动授权自定义密码验证跳转登录页面http转https 摘要 为了将老项目接口安全暴露给第三…

在线帮助中心搭建利器:Baklib

帮助中心是一个提供服务和支持的虚拟平台&#xff0c;旨在为客户提供解决问题和获取信息的途径。它通常包含企业或组织的产品或服务的相关信息、解决方案、操作指南和常见问题等信息。通过帮助中心&#xff0c;用户可以自助查询并解决问题&#xff0c;从而提高了客户的满意度和…

Neutron — 虚拟机网卡创建过程

目录 文章目录 目录创建并绑定虚拟机的虚拟网卡1、创建 VM 和 Port 记录2、创建 VM 和 Port 实体3、更新 Port 状态 创建并绑定虚拟机的虚拟网卡 在 OpenStack 中&#xff0c;Nova 负责虚拟机的生命周期管理&#xff0c;Neutron 负责虚拟网络的生命周期管理。而虚拟机的虚拟网…

两个直线/线段的交点 - C++

问题&#xff0c;求上图中线段AB 和线段CD的交点P的坐标 根据《算法艺术与信息学竞赛》&#xff0c;公式如下 原理&#xff1a; 利用叉积求得点P分线段DC的比&#xff0c;然后利用高中学习的定比分点坐标公式求得分点P的坐标 c代码如下 #include <math.h> #include &l…

压力山大?搭建JMeter分布式压测环境轻松应对!

目录 引言 windows环境部署 1.安装环境变量 2.配置环境变量 3.修改Jmeter配置文件 4.启动jmeter 5.启动分布式服务 Linux环境部署 1.安装JDKJmeter 2.环境优化 4.编写Jmeter脚本 5.启动Jmeter 6.停止Jmeter 7.打包查看测试报告 引言 您想要提高您的应用程序的性…

【JavaSE】Java基础语法(三十五):多线程实战

文章目录 1. 多线程入门1.1 多线程相关概念1.2 什么是多线程1.3 多线程的创建方式1.3.1 继承 Thread 的方式1.3.2 实现 Runnable 接口的方式1.3.3 实现 Callable 接口的方式1.3.4 Thread 类中常用方法1.3.5 sleep() 方法 和 wait() 方法区别&#xff1a; 2. 线程安全2.1 线程安…

破坏单例模式--存在的问题---问题的解决

目录 破坏单例模式--存在的问题---问题的解决 问题演示 破坏单例模式&#xff1a; 序列化 反射 序列化反序列化&#xff1a; 代码&#xff1a; 运行结果&#xff1a; 反射 代码&#xff1a; 运行结果&#xff1a; 问题的解决 序列化、反序列方式破坏单例模式的解…

Elasticsearch 8.X 性能优化参考 —— 筑梦之路

Elasticsearch 是实现用户无缝搜索体验的关键工具。它通过提供快速、准确和相关的搜索结果&#xff0c;彻底改变了用户与应用程序的互动方式。然而&#xff0c;要确保 Elasticsearch 部署达到最佳性能&#xff0c;就必须关注关键指标&#xff0c;并对诸如索引、缓存、查询、搜索…

monorepo 项目 Unable to resolve path to module ‘xxx‘.eslintimport/no-unresolved

同事问了一个问题&#xff0c;他现在参加了一个项目&#xff0c;这个项目是个monorepo 项目。 也就是多包管理、前后端一起都是js 写的。 问题 后端express 项目里配置的路径别名&#xff0c;eslint 不认识&#xff0c;报错。 Unable to resolve path to module /app/Prisma.e…

Phaser笔记-鼠标点击获取坐标键盘控制sprite

代码如下&#xff1a; import phaser;class PlayGame extends Phaser.Scene {constructor() {super("PlayGame");}preload() {this.load.spritesheet(run, assets/_Run.png, {frameWidth: 120, frameHeight: 80});this.load.spritesheet(idle, assets/_Idle.png, {f…

GEE:对Sentinel-2遥感影像进行处理,水体提取与可视化

作者&#xff1a;CSDN _养乐多_ 本文介绍了通过Google Earth Engine平台&#xff0c;并使用哨兵数据提取水体掩膜的方法和代码。通过裁剪和去除云等处理步骤&#xff0c;最终得到具有水体掩膜的影像&#xff0c;并进行可视化和导出。这种方法基于归一化水体指数&#xff08;N…