C语言 | 第十六章 | 共用体 家庭收支软件-1

P 151 结构体定义三种形式 2023/3/15

一、创建结构体和结构体变量

  1. 方式1-先定义结构体,然后再创建结构体变量
struct Stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
};
struct Stu stu1, stu2;
//定义了两个变量 stu1 和 stu2,它们都是 Stu 类型,都由 5 个成员组成
//注意关键字struct不能少
  1. 方式2-在定义结构体的同时定义结构体变量
struct Stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
} stu1, stu2;
//在定义结构体Stu 的同时,创建了两个结构体变量 stu1 和 stu2
  1. 方式3-如果只需要 stu1、stu2 两个变量,后面不需要再使用结构体数据类型,定义其他变量,在定义时也可以不给出结构体名
struct { //没有写 Stu
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
} stu1, stu2;
stu1.name = "tom"; stu1.num = 100;....   // 使用直接赋值
//1. 该结构体数据类型,没有名, 匿名结构体
//2. stu1 和 stu2 就是 该结构体的两个变量

二、成员的获取和赋值

基本说明:结构体和数组类似,也是一组数据的集合,整体使用没有太大的意义。数组使用下标[ ]获取单个元素,结构体使用点号.获取单个成员。获取结构体成员的一般格式为结构体变量名.成员名;

案例一:赋值1

struct{char *name; //姓名int num; //学号int age; //年龄char group; //所在小组float score; //成绩
} stu1;
stu1.name = "jack";   // 上面使用的方法
printf("%s", stu1.name)  

案例二:赋值2

#include<stdio.h>
void main(){struct Student{char *name; //姓名int num; //学号int age; //年龄char group; //所在小组float score; //成绩} stu1 = {"贾宝玉", 11, 18, 'B', 90.50}, stu2 = { "林黛玉", 12, 16, 'A', 100 };// 也可以在定义的时候直接赋值,按顺序依次来就可以了struct Student stu3 = {"林黛玉3", 12, 16, 'A', 100};// 这样再次赋值也是可以的;但是每个元素的对应关系需要一一对应struct Student stu4;// stu4= {"林黛玉3", 12, 16, 'A', 100}; 这样是不允许的,只允许在定义的时候赋值,因为后面是一个整体printf("\n stu3.name=%s",stu3.name); printf("\n stu1.name=%s",stu1.name);  // 输出也是同上输出getchar();
}

P 152 结构体应用实例 2023/3/17

一、基本步骤

  1. 声明(定义)结构体,确定结构体名
  2. 编写结构体的成员
  3. 编写处理结构体的函数

二、应用实例

  • 案例一:

    1. 编写一个Dog结构体,包含name(char[10])、age(int)、weight(double)属性。

    2. 编写一个say函数,返回字符串,信息中包含所有成员值。

    3. 在main方法中,创建Dog结构体变量,调用say函数,将调用结果打印输出。

#include<stdio.h>/*编写一个Dog结构体,包含name(char[10])、age(int)、weight(double)属性编写一个say函数,返回字符串,信息中包含所有成员值。在main方法中,创建Dog结构体变量,调用say函数,将调用结果打印输出*/// 定义一个Dog结构体struct Dog {char * name;int age;double weight;};//say函数, 返回字符串,信息中包含所有成员值char * say (struct Dog dog){// 将这个信息放入到一个字符串(字符数组)static char info[50];   // 最后返回的就是它,是局部静态变量sprintf(info,"name=%s age=%d weight=%.2f",dog.name,dog.age,dog.weight);// spintf 将值打印到字符串中return info;}void main(){struct Dog dog;char * info = NULL;dog.name = "小黄";dog.age = 1;dog.weight = 3.4;info = say(dog);   // 结构体默认是值传递// 函数中修改不会影响到函数外的值printf("\n 小狗的信息=%s",info);getchar();
}
  • 案例二:

    1. 编程创建一个Box结构体,在其中定义三个成员表示一个立方体的长、宽和高,长宽高可以通过控制台输入。

    2. 定义一个函数获取立方体的体积(volume)。

    3. 创建一个结构体,打印给定尺寸的立方体的体积。

    4. 思路

      struct Box {

      double len;

      double width;

      double height;

      double volumn;//体积

      }

#include<stdio.h>struct	Box {int length;int width;int height;
};int total(struct Box box){static int volume;return	volume=box.height * box.length * box.width;
}void main(){struct Box box;int  volume;// 输入长printf("\n请输入box的长");scanf("%d",&box.length);// 输入宽printf("\n请输入box的宽");scanf("%d",&box.width);// 输入高printf("\n请输入box的高");scanf("%d",&box.height);volume = total(box);printf("\nbox的体积为%d",volume);getchar();getchar();
}

image-20230317122456954

  • 案例三:景区门票案例
    1. 一个景区根据游人的年龄收取不同价格的门票。
    2. 请编写游人结构体(Visitor),根据年龄段决定能够购买的门票价格并输出。
    3. 规则:年龄>18 , 门票为20元,其它情况免费。
    4. 可以循环从控制台输入名字和年龄,打印门票收费情况, 如果名字输入 n ,则退出程序。
#include<stdio.h>
#include<string.h>/*
1)一个景区根据游人的年龄收取不同价格的门票。
2) 请编写游人结构体(Visitor),根据年龄段决定能够购买的门票价格并输出
3) 规则:年龄>18 , 门票为20元,其它情况免费。
4) 可以循环从控制台输入名字和年龄,打印门票收费情况, 如果名字输入 n ,则退出程序*///  定义个结构体
struct Visitor{char name[10];int age;double pay;  //  应付门票
};// 编写函数处理业务
//说明: 因为结构体默认是值传递,会拷贝一份完整的数据,效率就低
//			因此,为了提高效率,我们直接接收一个地址(指针)
void ticket(struct Visitor * visitor){// 判断if((*visitor).age > 18){  // 这里我们用的指针,需要使用取值符*(*visitor).pay = 20;}else{(*visitor).pay = 0;}
}void main(){// 测试// 创建结构体变量(创建一个游客)struct Visitor visitor;// 循环的输入名字和年龄while(1){printf("\n 请输入游客名字");scanf("%s",visitor.name);  // 数组不需要加地址符// 如果名字输入 n ,则退出程序if(!strcmp("n",visitor.name)){ // 这里可以取反,非0为真就进入if执行break;也可以strcmp("n",visitor.name)==0break;}printf("\n 请输入游客年龄");scanf("%d",&visitor.age);// 调用函数ticket,获取应付的票价ticket(&visitor);		  // 因为形参是指针,这里需要传一个地址;// 这样在函数里面操作visitor就是操作的main函数里面的visitorprintf("\n 该游客应付票价=%.2f",visitor.pay);}	printf("退出程序");getchar();getchar();
}

image-20230317141338383

P 153 共用体介绍和快速入门 2023/3/17

一、需求引入

引入:现有一张关于学生信息和教师信息的表格。学生信息包括姓名、编号、性别、职业、分数,教师的信息包括姓名、编号、性别、职业、教学科目。请看下面的表格:

image-20230317174740024

  • 传统方式解决:
    1. 定义结构体,根据人员的职业,使用对应的成员变量。
struct Person{
char name[20];
int num;
char sex;
char profession;
float score; // 学生使用 score
char course[20]; // 老师使用course 
} ;
  • 传统方式的问题分析
    1. 会造成 空间的浪费 , 比如学生只使用 score ,但是 也占用了course 成员的20个字节。
    2. struct Stustruct Teacher [但如果职业很多,就会对应多个结构体类型, 不利于管理]。
    3. 使用共用体。

二、基本介绍

  1. 共用体(Union)属于 构造类型,它可以包含多个类型不同的成员。和结构体非常类似, 但是也有不同的地方。
  2. 共用体有时也被称为联合或者联合体, 定义格式为
union 共用体名{
成员列表
};
  1. 结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

三、快速入门

  1. 定义共用体类型和共用体变量的三种方式(和结构体一样)。

image-20230317185534901

  1. 案例演示:
#include<stdio.h>union data{  // data就是一个共用体,包含三个成员,共用数据空间,该空间的大小以占用最大的成员变量为准int n;  // 4字节char ch; // 1字节short m; // 2字节	};void main(){union data a; // 定义了一个共用体变量 aprintf("%d, %d\n", sizeof(a), sizeof(union data) ); // 4,4 a.n = 0x40;  // 十六进制printf("%d, %c, %d\n", a.n, a.ch, a.m);  // 修改了一个成员的值,发现其他成员也有一个值a.ch = '9';printf("%d, %c, %d\n", a.n, a.ch, a.m);a.m = 0x2059;printf("%d, %c, %d\n", a.n, a.ch, a.m);a.n = 0x3E25AD54;printf("%d, %c, %d\n", a.n, a.ch, a.m);getchar();}

image-20230317192247061

P 154 共用体的内存布局 2023/3/17

一、内存布局

  • 案例同上一节:
#include<stdio.h>union data{  // data就是一个共用体,包含三个成员,共用数据空间,该空间的大小以占用最大的成员变量为准int n;  // 4字节char ch; // 1字节short m; // 2字节	};void main(){union data a; // 定义了一个共用体变量 aprintf("%d, %d\n", sizeof(a), sizeof(union data) ); // 4,4 a.n = 0x40;    // 十六进制 // int 4 字节,char 1字节,short 2字节// 根据内存图判断:    (最低位到最高位是从右到左)printf("%d, %c, %d\n", a.n, a.ch, a.m); // 这里第一位输出0x40的十进制64,第二位输出64对应的ASCII码@符,第三位同样64a.ch = '9';printf("%d, %c, %d\n", a.n, a.ch, a.m);// 第一位 字符9对应的ACSII码十进制为57,第二位对应字符为9,第三位为57a.m = 0x2059;printf("%d, %c, %d\n", a.n, a.ch, a.m);// 以下与上面同理:a.n = 0x3E25AD54;printf("%d, %c, %d\n", a.n, a.ch, a.m);getchar();}

二、布局图

image-20230317200548542

image-20230317200957782

P 155 共用体的最佳实践 2023/3/18

一、解决实践问题

#include<stdio.h>
#define TOTAL 2 //人员总数
// 定义了一个结构体person// 1.共用体使用方法一:
union Myunion { // 在下面定义名称float score;  char course[20];  
};
struct Person{char name[20];  // 姓名int num;  // 编号char sex;  // 性别char profession;   // 职业 s=>学生 t=>老师union Myunion sc;// 2.共用体使用方法二://union{  // 共用体所有成员 公用一段空间所以不会浪费空间//	float score;  //	char course[20];  //} sc;   // sc是一个共用体变量
};
void main(){int i;struct Person persons[TOTAL];  // 定义一个结构体数组// 之前定义了TOTAL等于2,相当于两个人,两种信息//输入人员信息for(i=0; i<TOTAL; i++){printf("Input info: ");scanf("%s %d %c %c", persons[i].name, &(persons[i].num), &(persons[i].sex), &(persons[i].profession));if(persons[i].profession == 's'){ //如果是学生printf("请输入该学生成绩");scanf("%f", &persons[i].sc.score);}else{ //如果是老师printf("请输入该老师课程");scanf("%s", persons[i].sc.course);}fflush(stdin);  // 刷新;输入,保证数据都写入到结构体里面去了}//输出人员信息//输出人员信息printf("\nName\t\tNum\tSex\tProfession\tScore / Course\n"); // 想按一个表格输出,所以我们使用制表符\tfor(i=0; i<TOTAL; i++){if(persons[i].profession == 's'){ //如果是学生printf("%s\t\t%d\t%c\t%c\t\t%f\n", persons[i].name, persons[i].num, persons[i].sex, persons[i].profession, persons[i].sc.score);}else{ //如果是老师printf("%s\t\t%d\t%c\t%c\t\t%s\n", persons[i].name, persons[i].num, persons[i].sex, persons[i].profession, persons[i].sc.course);}}getchar();getchar();
}

P156 项目-家庭收支软件(1) 2023/3/18

一、需求说明

image-20230318163342944

image-20230318163403959

image-20230318163418563

image-20230318163438600

image-20230318163504410

image-20230318163534895

image-20230318163552789

image-20230318163601511

image-20230318163613308

image-20230318163622772

二、需求实现(1)

#include<stdio.h>
#include<string.h>void main(){// 完成1:显示菜单//  分析:// 1.使用do-while来显示菜单,如果用户输入4表示程序退出  // 完成2:登记收入// 分析:// 1. 需要一个字符串记录收支入情况// 定义相关变量char key = '	'; // 表示用户输入了哪个菜单int loop = 1; // 控制是否退出菜单char details [3000] = "-----------------当前收支明细记录-----------------\n收支\t收支金额\t账户金额\t说 明";  // 记录所有的收入和支出情况char note[20] = ""; // 对收入或者支出的说明char temp[100] = "";  // 是用于格式化每次的收入或者支出,然后拼接到details中去double money = 0.0;double balance = 1000.0; // 账号余额do{printf("\n\n-------家庭收支记账软件-----------");printf("\n	1收支明细");printf("\n	2登记收入");                  printf("\n	3登记支出");                   printf("\n	4退出");                            printf("\n选择(1-4):");         scanf("%c",&key);  getchar(); // 过滤回车switch(key) {case '1':printf("%s",details);break;case '2':printf("\n 本次收入金额:");scanf("%lf",&money);getchar();  // 过滤回车balance += money;   // 更新余额printf("\n 本次收入说明:");scanf("%s",note);getchar();  // 过滤回车// 将信息拼接到detailssprintf(temp,"\n收入\t%.2f\t\t%.2f\t\t%s",money,balance,note);strcat(details,temp);break; case '3':printf("登记支出");break;case '4':loop = 0;}      }while(loop);printf("退出菜单!");getchar();
}

P157 项目-家庭收支软件(2) 2023/3/19

一、需求实现(2)

  • 项目代码实现改进
    1. 用户输入4退出时,给出提示"你确定要退出吗? y/n",必须输入正确的y/n ,否则循环输入指令,直到输入y 或者 n。
    2. 当没有任何收支明细时,提示 “当前没有收支明细… 来一笔吧!”
    3. 在支出时,判断余额是否够,并给出相应的提示。
#include<stdio.h>
#include<string.h>
void main(){// 完成1:显示菜单//  分析:// 1.使用do-while来显示菜单,如果用户输入4表示程序退出  // 完成2:登记收入// 分析:// 1. 需要一个字符串记录收支入情况// 完成3:等级支出// 1. 同收入// 完成4:/*用户输入4退出时,给出提示"你确定要退出吗? y/n",必须输入正确的y/n ,否则循环输入指令,直到输入y 或者 n。*/// 完成5:// 当没有任何收支明细时,提示 "当前没有收支明细... 来一笔吧!"// 完成6:// 在支出时要判断余额是否够,并给出相应提示:// 定义相关变量char key = '	'; // 表示用户输入了哪个菜单int loop = 1; // 控制是否退出菜单char details [3000] = "-----------------当前收支明细记录-----------------\n收支\t收支金额\t账户金额\t说 明";  // 记录所有的收入和支出情况char note[20] = ""; // 对收入或者支出的说明char temp[100] = "";  // 是用于格式化每次的收入或者支出,然后拼接到details中去double money = 0.0;double balance = 1000.0; // 账号余额char choice = ' ';  // 表示用户选择选择是y/nint flag = 0;  //  表示是否有一笔支出或者收入do{printf("\n\n-------家庭收支记账软件-----------");printf("\n	1收支明细");printf("\n	2登记收入");                  printf("\n	3登记支出");                   printf("\n	4退出");                            printf("\n选择(1-4):");         scanf("%c",&key);  getchar(); // 过滤回车switch(key) {case '1':if(flag){printf("%s",details);}else{printf("\n当前没有收支明细……,来一笔吧!");}break;case '2':printf("\n 本次收入金额:");scanf("%lf",&money);getchar();  // 过滤回车balance += money;   // 更新余额printf("\n 本次收入说明:");scanf("%s",note);getchar();  // 过滤回车// 将信息拼接到detailssprintf(temp,"\n收入\t%.2f\t\t%.2f\t\t%s",money,balance,note);strcat(details,temp);flag = 1;break; case '3':printf("\n 本次支出金额:");scanf("%lf",&money);getchar();  // 过滤回车//判断是否足够支出if(money >balance){  // 不够printf("余额不足……");		break;}balance -= money;   // 更新余额printf("\n 本次支出说明:");scanf("%s",note);getchar();  // 过滤回车// 将信息拼接到detailssprintf(temp,"\n支出\t%.2f\t\t%.2f\t\t%s",money,balance,note);strcat(details,temp);flag = 1;break; case '4':printf("\n你确定要退出吗?y/n");do{scanf("%c",&choice);getchar();if(choice == 'y' || choice == 'n'){break;}printf("\n你的输入有误,请重新输入y/n");}while(1);if(choice == 'y'){  // 输出的为y,就将loop赋值为0loop = 0;   }}     }while(loop);printf("退出菜单!");getchar();
}

P158 项目-家庭收支软件(3) 2023/3/19

一、需求实现(3)

  1. 改成使用结构体完成 => 并且使用函数来提高项目的模块化编程, 利用今后项目的维护和扩展。
  2. 这样更容易维护,当需要增加功能的时候,只需要找到对应的函数进行更改。
#include<stdio.h>
#include<string.h>// 定义一个结构体
struct MyFamilyAccount {int flag;  // 表示是否有一笔收入或者支出char details[3000]; // 明细double balance; // 余额
} myFamilyAccount;// 下面为全局变量:
char key = '	'; // 表示用户输入了哪个菜单
int loop = 1; // 控制是否退出菜单
char note[20] = ""; // 对收入或者支出的说明
char temp[100] = "";  // 是用于格式化每次的收入或者支出,然后拼接到details中去
double money = 0.0;
char choice = ' ';  // 表示用户选择选择是y/n// 使用函数,显示明细
void showDetails(struct MyFamilyAccount * myFamilyAccount){if((* myFamilyAccount).flag){printf("%s",(* myFamilyAccount).details);}else{printf("\n当前没有收支明细……,来一笔吧!");}
}//使用函数,完成一个登记收入
void income(struct MyFamilyAccount * myFamilyAccount){printf("\n 本次收入金额:");scanf("%lf",&money);getchar();  // 过滤回车(* myFamilyAccount).balance += money;   // 更新余额printf("\n 本次收入说明:");scanf("%s",note);getchar();  // 过滤回车// 将信息拼接到detailssprintf(temp,"\n收入\t%.2f\t\t%.2f\t\t%s",money,(* myFamilyAccount).balance,note);strcat((* myFamilyAccount).details,temp);(* myFamilyAccount).flag = 1;
}// 使用函数,完成一个登记支出
void pay(struct MyFamilyAccount * myFamilyAccount){printf("\n 本次支出金额:");scanf("%lf",&money);getchar();  // 过滤回车//判断是否足够支出// 这里account是在结构体中了,需要取出来if(money >(*myFamilyAccount).balance){  // 不够printf("余额不足……");		//				break;   // 这里是break了,不能在函数中使用,函数中自然使用return语句return;}(*myFamilyAccount).balance -= money;   // 更新余额printf("\n 本次支出说明:");scanf("%s",note);getchar();  // 过滤回车// 将信息拼接到detailssprintf(temp,"\n支出\t%.2f\t\t%.2f\t\t%s",money,(*myFamilyAccount).balance,note);strcat((*myFamilyAccount).details,temp);(*myFamilyAccount).flag = 1;
}//使用一个函数,完成退出
void myexit(){  // 这里没有使用到结构体,不需要传入printf("\n你确定要退出吗?y/n");do{scanf("%c",&choice);getchar();if(choice == 'y' || choice == 'n'){break;}printf("\n你的输入有误,请重新输入y/n");}while(1);if(choice == 'y'){  // 输出的为y,就将loop赋值为0loop = 0;   }
}   // 该函数专门用于显示菜单
void mainMenu(struct MyFamilyAccount * myFamilyAccount  ){do{printf("\n\n-------家庭收支记账软件-----------");printf("\n	1收支明细");printf("\n	2登记收入");                  printf("\n	3登记支出");                   printf("\n	4退出");                            printf("\n选择(1-4):");         scanf("%c",&key);  getchar(); // 过滤回车switch(key) {case '1':showDetails(myFamilyAccount);break;case '2':income(myFamilyAccount);break;case '3':pay(myFamilyAccount);break;case '4':myexit();}}while(loop);
}void main(){// 创建一个结构体变量struct MyFamilyAccount myFamilyAccount;// 初始化myFamilyAccount.flag = 0;myFamilyAccount.balance = 1000.0;// 使用拷贝的方式赋值memset(myFamilyAccount.details,3000,0);  //  先要清零strcpy(myFamilyAccount.details,"-----------------当前收支明细记录-----------------\n收支\t收支金额\t账户金额\t说 明");// 调用mainMenu显示菜单mainMenu(&myFamilyAccount);getchar();
}

二、结构示意图

image-20230321170235220

P 159 项目-CRM(1)-程序框架图 2023/3/23

一、项目需求说明

说明:模拟实现基于文本界面的《客户信息管理软件》。该软件能够实现对客户对象的插入、修改和删除(用数组实现),并能够打印客户明细表。

image-20230323192642160

image-20230323192658914

image-20230323192707577

image-20230323192722382

image-20230323192731730

image-20230323192749505

image-20230323192800182

image-20230323192809722

image-20230323192830906

二、程序框架图

作用:描述该项目包含多少个文件,明确文件与文件之间的调用关系。

image-20230323193601301

P 160 项目-CRM(2)-客户结构体 2023/3/23

一、完成Customer结构体

  • 思路:
    1. Customer结构体含有的成员,应该从给出的界面来分析
    2. 分析出有6个成员,数据类型也可以分析出来
    3. 编写一个函数,输出的给出的某个Customer变量的信息
#include<stdio.h>// 定义结构体数据类型 
struct Customer{int id; // 编号int age;  // 年龄char name[10]; // 名字char gender;  // f 表示女,m表示男char phone[16]; //  电话号码char email[20]; // 邮箱
};// 显示一个Customer变量的信息
// 这里我们接收的是结构体指针,目的是提高效率
void getCustomerInfo(struct Customer * customer){printf("\n%d\t%s\t%s\t%d\t%c\t%s\t%s",(* customer).id,(* customer).gender,(* customer).name,(* customer).age,(* customer).phone,(* customer).email);
}

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

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

相关文章

基于SpringBoot+Vue+Uniapp的植物园管理小程序系统(2024最新,源码+文档+远程部署+讲解视频等)

3. 论文参考 4. 项目运行截图 5. 技术框架 5.1 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring …

Spring Boot在知识管理中的应用

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

数据检测和响应:DDR 用于数据安全

数据检测和响应 (DDR) 用于主动数据安全态势管理 企业必须保护其数据免受网络攻击&#xff0c;主要有三个原因&#xff1a; 1. 公司有法律义务保证客户信息的安全&#xff1b; 2. 不这样做会损害公司的声誉&#xff1b; 3. 补救数据泄露的影响可能代价高昂&#xff0c;而且…

数据结构前置知识(上)

1. 初识集合框架 1.1 什么是集合框架 在了解集合框架之前,我们先来认识一下数据结构,所谓数据结构就是描述和组织数据的一个东西. 那什么是集合框架呢?在java里面集合框架(Java Collection Framework),又被称为容器container,说白了就是很多个接口,抽象类,实现类组成的一个包,…

架构设计笔记-12-信息系统架构设计理论与实践

目录 知识要点 案例分析 1.Java企业级应用系统 2.c/s架构&#xff0c;b/s架构 知识要点 软件架构风格是描述某一特定应用领域中系统组织方式的惯用模式。架构风格定义了一类架构所共有的特征&#xff0c;主要包括架构定义、架构词汇表和架构约束。 数据挖掘是从数据库的大…

OceanBase 4.x 部署实践:如何从单机扩展至分布式部署

OceanBase 4.x 版本支持2种部署模式&#xff1a;单机部署与分布式部署&#xff0c;同时支持从单机平滑扩展至分布式架构。这样&#xff0c;可以有效解决小型业务向大型业务转型时面临的扩展难题&#xff0c;降低了机器资源的成本。 以下将详述如何通过命令行&#xff0c;实现集…

解决IPv6网络引起的网页与程序卡顿问题-本地DNS解析方案

一、问题环境 连接IPv6WiFi网络时&#xff0c;易出现网页打不开&#xff0c;程序开启无法加载画面。系统环境为Win10。 二、解决思路 在用户端无法触及路由器、网关等管理资源时&#xff0c;只能从本地环境中更改配置。多适用于公共WiFi&#xff0c;私人WiFi可直接从路由器DNS、…

手撕数据结构 —— 队列(C语言讲解)

目录 1.什么是队列 2.如何实现队列 3.队列的实现 Queue.h中接口总览 具体实现 结构的定义 初始化 销毁 入队列 出队列 取队头元素 取队尾元素 判断是否为空 获取队列的大小 4.完整代码附录 Queue.h Queue.c 1.什么是队列 队列是一种特殊的线性表&#xff0…

【uni-app】HBuilderX安装uni-ui组件

目录 1、官网找到入口 2、登录帐号 3、打开HuilderX 4、选择要应用的项目 5、查看是否安装完成 6、按需安装 7、安装完毕要重启 8、应用 前言&#xff1a;uniapp项目使用uni-ui组件方式很多&#xff0c;有npm安装等&#xff0c;或直接创建uni-ui项目&#xff0c;使用un…

【Oracle数据库进阶】001.SQL基础查询_查询语句

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…

Aria2Cloudreve任意文件写入到RCE

什么是Aria2 Aria2 是一个轻量级的命令行下载工具&#xff0c;支持多种下载协议&#xff0c;如 HTTP、FTP、SFTP、BitTorrent 和 Metalink。它以其强大的多源下载能力而著称&#xff0c;可以同时从多个服务器或对等节点下载文件&#xff0c;加快下载速度。Aria2 占用资源少&am…

【C++】拆分详解 - vector

文章目录 一、vector的介绍二、vector的使用1. 构造2. 迭代器3. vector 空间增长问题4. 增删查改5. vector 迭代器失效问题5.1 底层空间改变&#xff08;扩容、缩容&#xff09;5.2 指定位置元素的删除操作5.3 Linux与VS平台差异 三、vector 模拟实现0. 整体框架1. 构造 / 析构…

图解 微信开发者工具 小程序源码 调试、断点标记方法 , 微信小程序调试器,真机调试断点调试方法,小程序网络API请求调试方法 总结

在我们使用微信开发者工具进行微信小程序开发的时候&#xff0c;在这个微信开发者工具的代码编辑框里面我们是无法像使用vscode, idea等IDE工具时那样直接对代码打断点进行调试&#xff0c; 原因是小程序实际上他就是一个web浏览器应用的包装, 在其内部使用的还是类似chrome的…

塔吊识别数据集 yolo格式 共5076张图片 已划分好训练验证 txt格式 yolo可直接使用

塔吊识别数据集 yolo格式 共5076张图片 已划分好训练验证 txt格式 yolo可直接使用。 类别&#xff1a;塔吊(Tower-crane) 一种 训练数据已划分&#xff0c;配置文件稍做路径改动即可训练。 训练集&#xff1a; 4724 &#xff08;正面3224 负面1500&#xff09; 验证集&#xf…

C#实现Punycode编码/解码

测试代码 string word "我爱你"; string idn "我爱你.中国"; string wordCode PunyCode.Encode(word); string punycode PunyCode.IDN2Punycode(idn);Console.WriteLine(word); Console.WriteLine(wordCode); Console.WriteLine(PunyCode.Decode(word…

外卖点餐系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;外卖员管理&#xff0c;餐厅管理&#xff0c;用户管理&#xff0c;菜品分类管理&#xff0c;菜品信息管理&#xff0c;外卖订单管理&#xff0c;订单配送管理 微信端账号功能包括&#xff1a;系统首页…

OKHTTP 如何处理请求超时和重连机制

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…

Linux下Docker方式Jenkins安装和配置

一、下载&安装 Jenkins官方Docker仓库地址&#xff1a;https://hub.docker.com/r/jenkins/jenkins 从官网上可以看到&#xff0c;当前最新的稳定版本是 jenkins/jenkins:lts-jdk17。建议下在新的&#xff0c;后面依赖下不来 所以&#xff0c;我们这里&#xff0c;执行doc…

VS+QT 自定义插件变成动态库加载及使用

一、前言 有个界面需要重复使用某个自定义的控件&#xff0c;希望自定义控件能够像动态库文件那样&#xff0c;添加引用lib就能使用&#xff0c;经过多次太坑后&#xff0c;总结如下 二、实现方式 ① 新建项目&#xff0c;选择"Qt Designer Custom Widget" 创建自定…

python爬虫 - 进阶正则表达式

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、匹配中文 &#xff08;一&#xff09;匹配单个中文字符 &#xff08;二…