C语言进阶 11.结构体
C语言进阶 11.结构体
文章目录
- C语言进阶 11.结构体
- 11.1. 枚举
- 11.2. 结构类型
- 11.3. 结构与函数
- 11.4. 结构中的结构
- 11.5. 类型定义
- 11.6. 联合
- 11.7. PAT
- 11-0. 平面向量加法(10)
- 11-1. 通讯录的录入与显示(10)
11.1. 枚举
-
常量符号化:
- 用符号而不是具体的数字表示程序中的数字
- const int red = 0;
- const int yellow = 1;
- const int green = 2;
- 用符号而不是具体的数字表示程序中的数字
-
枚举:
-
用枚举而不是定义独立的const int变量
- enum COLOR { RED, YELLOW, GREEN };//0 1 2
-
枚举是一种用户定义的数据类型, 它用关键字enum以如下语法来声明:
- enum枚举类型名字{ 名字0, …, 名字n };
-
枚举类型名字通常并不真的使用, 要用的是在打括号里的名字, 因为它们就是常量符号, 它们的类型是int, 值则依次从0到n, 如:
- enum colors { red, yellow, green };//三个常量, red是0, yellow是1, green是2
-
当需要一些可以排列起来的常量值时, 定义枚举的意义就是给了这些常量值名字
-
枚举类型可以跟上enum作为类型
- void f(enum COLOR c);
-
它是以整数来做内部计算和外部输入输出的
-
-
套路: 自动计数的枚举:
- 这样需要遍历所有的枚举量或者建立一个用枚举量做下标的数组的时候就很方便了
- enum COLOR { RED, YELLOW, GREEN, NumCOLORS };//NumCOLORS就表示这个枚举有多少个量
char* ColorNames[NumCOLORS] = {"red","yellow","green", };
- 这样需要遍历所有的枚举量或者建立一个用枚举量做下标的数组的时候就很方便了
-
枚举量:
- 声明枚举量的时候可以指定值
- enum COLOR { RED = 1; YELLOW, GREEN = 5 };//1 2 5
- 声明枚举量的时候可以指定值
-
枚举只是int:
- 即使给枚举类型的变量赋不存在的整数值也没有任何的warning或error
- enum COLOR RED = 3;
- 即使给枚举类型的变量赋不存在的整数值也没有任何的warning或error
-
枚举:
-
虽然枚举类型可以当作类型使用, 但是实际上很(bu)少(hao)用
-
如果有意义上排比的名字, 用枚举比const int方便
-
枚举比宏(macro)好, 因为枚举有int类型
-
#include <stdio.h>const int red = 0;
const int yellow = 1;
const int green = 2;enum COLOR { RED, YELLOW, GREEN };//0 1 2void f(enum COLOR c);int main(int argc, char const* argv[]) {int color = -1;scanf("%d", &color);char* colorName = NULL;printf("%d %d %d\n", RED, YELLOW, GREEN);switch (color) {case RED: colorName = "red"; break;case YELLOW: colorName = "yellow"; break;case GREEN: colorName = "green"; break;default: colorName = "unknown"; break;}printf("%s\n", colorName);return 0;
}
#include <stdio.h>enum COLOR { RED, YELLOW, GREEN, NumCOLORS };int main(int argc, char const* argv[]) {int color = -1;char* ColorNames[NumCOLORS] = {"red","yellow","green",};char* colorName = NULL;scanf("%d", &color);if (color >= 0 && color < NumCOLORS) {colorName = ColorNames[color];}else {colorName = "unknown";}printf("%s\n", colorName);return 0;
}
11.2. 结构类型
-
声明结构类型:
- 一个结构就是一个复合的数据类型, 里面可以有各种不同类型的成员, 用一个变量来表达它们
struct date { //一个结构可以有多个成员int month;int day;int year;//成员变量 }; //初学者最常见的错误: 漏了这个分号
- 一个结构就是一个复合的数据类型, 里面可以有各种不同类型的成员, 用一个变量来表达它们
-
在函数内/外?
- 和本地变量一样, 在函数内部声明的结构类型只能在函数内部使用
- 所以通常在函数外部声明结构类型, 这样就可以被多个函数所使用了
-
声明结构的形式:
-
- struct point{
int x;
int y;
};
struct point p1, p2;
- p1和p2都是point里面有x和y的值
- struct point{
-
- struct {
int x;
int y;
} p1, p2;
- p1和p2都是一种无名结构, 里面有x和y
- struct {
-
- struct point {
int x;
int y;
} p1, p2;
- p1和p2都是point里面有x和y的值
- struct point {
-
第一和第三种形式, 都声明了结构point并定义了两个变量, 而第二种形式没有声明point
-
-
结构变量:
-
struct date today; //定义结构变量
-
today.month = 07; //给变量赋值
today.day = 31;
today.year = 2014;
-
-
结构的初始化:
- struct date today = { 07, 31, 2014 };
- struct date today = { .month = 07, .year = 2014 };//.day没有初始化, 和数组初始化一样, 默认为0
-
结构成员:
-
结构和数组有点像, 数组当中有很多的单元, 而结构当中有很多的成员, 不同的是, 数组当中的单元只能是相同类型的, 而结构当中的成员可以是不同类型的
-
数组用[]运算符和下标访问其成员
- a[0] = 10;
-
结构用.运算符和名字访问其成员
today.day
today.month
today.year
-
-
结构运算:
-
要访问整个结构, 直接用结构变量的名字
-
对于整个结构, 可以做赋值, 取地址, 也可以传递给函数参数
p1 = (struct point){5, 10};//相当于p1.x = 5; p1.y = 10;p1 = p2; //相当于p1.x = p2.x; p1.y = p2.y;
-
-
结构指针:
- 和数组不同, 结构变量的名字并不是结构变量的地址, 必须使用&运算符
- struct date* pDate = &today;
- 和数组不同, 结构变量的名字并不是结构变量的地址, 必须使用&运算符
#include <stdio.h>struct date { //声明结构类型int month;int day;int year;
};
struct point {int x;int y;
};
int main(int argc, char const* argv[]) {struct date today = { 07, 31, 2014 }; //定义结构变量today.month = 07; //访问结构成员today.day = 31;today.year = 2014;today = (struct date){ 07, 31, 2014 };//类型转换struct date day;day = today; //结构变量给结构变量赋值, 而数组是不能这样做的day.year = 2015;struct date* pDate = &today;printf("Today's date is %i-%i-%i.\n", today.year, today.month, today.day);printf("day's date is %i-%i-%i.\n", day.year, day.month, day.day);printf("address of today is %p\n", pDate);return 0;
}
11.3. 结构与函数
-
没听懂
-
结构作为函数参数:
-
int numberOfDays(struct date d)
-
整个结构可以作为参数的值传入函数
-
这时候是在函数内新建一个结构变量, 并复制调用者的结构的值
-
也可以返回一个结构
-
这与数组是完全不同的
-
-
输入结构:
-
没有直接的方式可以一次scanf一个结构
-
如果我们打算写一个函数来读入结构
-
但是读入的结构如何送回来呢?
-
记住C在函数调用时是传值的
-
所以函数中的p与main中的y是不同的
-
在函数读入了p的数值之后, 没有任何东西回到main, 所以y还是{0,0}
-
-
解决方案:
-
之前的方案, 把一个结构传入了函数, 然后再函数中操作, 但是没有返回回去
- 问题在于传入函数的是外面那个结构的克隆体, 而不是指针
- 传入结构和传入数组是不同的
- 问题在于传入函数的是外面那个结构的克隆体, 而不是指针
-
在这个输入函数中, 完全可以创建一个临时的结构变量, 然后把这个结构返回给调用者
-
-
-
结构指针作为参数:
- C语言经典教材<<K & R>>说过(p.131)
- If a large structure is to be passed to a function, it is generally more efficient to pass a pointer than to copy the whole structure.
- 传一个结构给函数的时候, 应该传指针, 而不是整个结构
- C语言经典教材<<K & R>>说过(p.131)
-
指向结构的指针:
-
用->表示指针所指的结构变量中的成员
-
(*p).month = 12;
-
p->month = 12;//这个写法更简洁, ->读作arrow
-
有了这个运算符之后, 就可以将3当中实现的代码修改
-
-
输入今天的日期, 打印明天的日期
#include <stdio.h>
#include <stdbool.h>struct date {int month;int day;int year;
};bool isLeap(struct date d);
int numberOfDays(struct date d);int main(int argc, char const* argv[]) {struct date today, tomorrow;printf("Enter today's date (mm dd yyyy):");scanf("%i %i %i", &today.month, &today.day, &today.year);if (today.day != numberOfDays(today)) {tomorrow.day = today.day + 1;tomorrow.month = today.month;tomorrow.year = today.year;}else if (today.month == 12) {tomorrow.day = 1;tomorrow.month = 1;tomorrow.year = today.year + 1;}else {tomorrow.day = 1;tomorrow.month = today.month + 1;tomorrow.year = today.year;}printf("Tomorrow's date is %i-%i-%i.\n", tomorrow.year, tomorrow.month, tomorrow.day);return 0;
}int numberOfDays(struct date d) {int days;const int daysPerMonth[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };if (d.month == 2 && isLeap(d)) {days = 29;}else {days = daysPerMonth[d.month - 1];}return days;
}bool isLeap(struct date d) {bool leap = false;if ((d.year % 4 == 0 && d.year % 100 != 0) || d.year % 400 == 0) {leap = true;}return leap;
}
- 方案一完成入读结构的功能, 行不通
#include <stdio.h>struct point {int x;int y;
};void getStruct(struct point);
void output(struct point);int main(void) {struct point y = { 0,0 };getStruct(y);output(y);
}void getStruct(struct point p) {scanf("%d", &p.x);scanf("%d", &p.y);printf("%d, %d\n", p.x, p.y);
}
void output(struct point p) {printf("%d, %d\n", p.x, p.y);
}
方案二
#include <stdio.h>struct point {int x;int y;
};struct point getStruct(void);
void output(struct point);int main(int argc, char const* argv[]) {struct point y = { 0,0 };y = getStruct();output(y);
}struct point getStruct(void) {struct point p;scanf("%d", &p.x);scanf("%d", &p.y);printf("%d, %d\n", p.x, p.y);return p;
}
void output(struct point p) {printf("%d, %d\n", p.x, p.y);
}
- ->运算符
#include <stdio.h>struct date {int month;int day;int year;
}myday;int main(void) {struct date* p = &myday;(*p).month = 12;p->month = 12;printf("%i\n", (*p).month);printf("%i\n", p->month);return 0;
}
- 修改后
#include <stdio.h>struct point {int x;int y;
};struct point* getStruct(struct point* p);
void output(struct point);
void print(const struct point* p);int main(int argc, char const* argv[]) {struct point y = { 0,0 };getStruct(&y);output(y);output(*getStruct(&y));print(getStruct(&y));*getStruct(&y) = (struct point){ 1,2 };
}struct point* getStruct(struct point* p) {scanf("%d", &p->x);scanf("%d", &p->y);printf("%d, %d\n", p->x, p->y);return p;
}
void output(struct point p) {printf("%d, %d\n", p.x, p.y);
}
void print(const struct point* p) {printf("%d, %d\n", p->x, p->y);
}
11.4. 结构中的结构
- 没听懂
- 结构数组:
struct date dates[100]; struct date dates[] = {{4,5,2005}, {2,4,2005} }
- 结构中的结构:
struct dateAndTime{struct date sdate;struct time stime;};
#include <stdio.h>struct time {int hour;int minutes;int seconds;
};struct time timeUpdate(struct time now);int main(void) {struct time testTimes[5] = {{11,59,59}, {12,0,0},{1,29,59},{23,59,59},{19,12,27}};return 0;
}
struct time timeUpdate(struct time now) {}
11.5. 类型定义
-
自定义数据类型(typedef):
-
C语言提供了一个typedef的功能来声明一个已有的数据类型的新名字, 改善了程序的可读性, 比如:
- typedef int Length;
- 使得Length成为int类型的别名
-
这样, Length这个名字就可以代替int出现在变量定义和参数声明的地方了:
- Length a,b,len;
- Length numbers[10]; //但是这样感觉比原来还复杂, 所以typedef就用在定义结构的别名时使用就可以
-
typedef struct {int month;int day;int year;} mydate; //这里是没有名字的struct, mydate是struct的别名
#include <stdio.h>typedef struct date {int month;int day;int year;
} mydate; //在typedef和最后的单词中间的东西都是原来的, 最后的单词mydate是struct date的别名int main(int argc, char const* argv[]) {typedef int Length;Length a, b, len;Length numbers[10];mydate d = { 9, 1, 2005 };return 0;
}
11.6. 联合
-
联合(union):
union AnEit {int i;char c;} elt1, elt2;
-
这个结构中有两个成员i和c, 对于是struct, i和c的值是分开的, 随时都可以使用其中的 任何一个, 而对于union, i和c是联合的, 它们都占据了相同的内存空间
-
联合: 所有的成员共享一个空间, 同一时间只有一个成员是有效的, union的大小是其最大的成员
-
-
union的用处:
- 通过这个方法可以得到一个int或者double或者其它类型的内部的各个字节
#include <stdio.h>union AnEit {int i;char c;
} elt1, elt2;int main(int argc, char const* argv[]) {elt1.i = 4;elt2.c = 'a';elt2.i = 0xDEADBEEF;return 0;
}
- union的用处:
#include <stdio.h>typedef union {int i;char ch[sizeof(int)];
} CHI;int main(void) {CHI chi;int i;chi.i = 1234; //0x04D2for (i = 0; i < sizeof(int); i++) {printf("%02hhX", chi.ch[i]); //小端:000004D2 大端:D2040000}printf("\n");return 0;
}
11.7. PAT
-
11-0. 平面向量加法(10)
-
疑问:
-
如果处理这个功能: 不能输出-0.0
-
fabs()函数:
- 返回某一个值的绝对值
- #include <math.h>
-
-
本题要求编写程序,计算两个二维平面向量的和向量。
-
输入格式:
输入在一行中按照“x1 y1 x2 y2”的格式给出两个二维平面向量V1=(x1, y1)和V2=(x2, y2)的分量。 -
输出格式:
在一行中按照“(x, y)”的格式输出和向量,坐标输出小数点后1位(注意不能输出-0.0)。 -
输入样例:
3.5 -2.7 -13.9 8.7 -
输出样例:
(-10.4, 6.0)
-
-
看着答案完成的处理-0.0功能
#include <stdio.h>
#include <math.h>//声明结构类型
struct xiangLiang {double x;double y;
} xY, Xy; //定义结构变量int main() {//引用结构成员进行输入scanf("%lf %lf %lf %lf", &xY.x, &xY.y, &Xy.x, &Xy.y);//结果变量double resultX = xY.x + Xy.x;double resultY = xY.y + Xy.y;//判断-0.0的情况if (fabs(resultX) < 0.05) {resultX = fabs(resultX);}if (fabs(resultY) < 0.05) {resultY = fabs(resultY);}printf("(%.1f, %.1f)\n", resultX, resultY);//求和并输出//printf("(%.1f, %.1f)\n", xY.x + Xy.x, xY.y + Xy.y);return 0;
}
- 答案
答案
#include <stdio.h>
#include <math.h>
#define EPSILON 0.05struct Vector {double x;double y;
};int main(void)
{struct Vector v1, v2, v3;scanf("%lf %lf %lf %lf", &v1.x, &v1.y, &v2.x, &v2.y);v3.x = v1.x + v2.x;v3.y = v1.y + v2.y;if(fabs(v3.x) < EPSILON)v3.x = fabs(v3.x);if(fabs(v3.y) < EPSILON)v3.y = fabs(v3.y);printf("(%.1f, %.1f)\n", v3.x, v3.y);return 0;
}
-
11-1. 通讯录的录入与显示(10)
-
疑问:
-
如何查询记录编号?
-
已解决, 通过结构数组的方式将输入的结构成员信息和输入的记录编号存放起来, 遍历数组, 使用下标和.访问数组和结构中的单元和成员, 打印输出
-
-
通讯录中的一条记录包含下述基本信息:朋友的姓名、出生日期、性别、固定电话号码、移动电话号码。本题要求编写程序,录入N条记录,并且根据要求显示任意某条记录。
-
输入格式:
输入在第1行给出正整数N(<=10);随后N行,每行按照格式“姓名 生日 性别 固话 手机”给出一条记录。其中“姓名”是不超过10个字符、不包含空格的非空字符串;生日按“yyyy/mm/dd”的格式给出年月日;性别用“M”表示“男”、“F”表示“女”;“固话”和“手机”均为不超过15位的连续数字,前面有可能出现“+”。
在通讯录记录输入完成后,最后一行给出正整数K,并且随后给出K个整数,表示要查询的记录编号(从0到N-1顺序编号)。数字间以空格分隔。 -
输出格式:
对每一条要查询的记录编号,在一行中按照“姓名 固话 手机 性别 生日”的格式输出该记录。若要查询的记录不存在,则输出“Not Found”。 -
输入样例:
3
Chris 1984/03/10 F +86181779452 13707010007
LaoLao 1967/11/30 F 057187951100 +8618618623333
QiaoLin 1980/01/01 M 84172333 10086
2 1 7 -
输出样例:
LaoLao 057187951100 +8618618623333 F 1967/11/30
Not Found
-
-
看着答案写的
#include <stdio.h>struct tongXunLu {//朋友的姓名、出生日期、性别、固定电话号码、移动电话号码char name[10];struct birthday {int year;int month;int day;} date;char sex;char guHua[15];char phone[15];
};int main(int argc, char const* argv[]) {//定义结构变量struct tongXunLu inf[10];//输入nint n;scanf("%d", &n);//循环输入n次int i;for (i = 0; i < n; i++) {//输入信息scanf("%s %i/%i/%i %c %s %s", &inf[i].name, &inf[i].date.year, &inf[i].date.month, &inf[i].date.day, &inf[i].sex, &inf[i].guHua, &inf[i].phone);}//输入kint k;scanf("%d", &k);//输入k个整数//num[i]表示查询的记录编号int num[10];for (i = 0; i < k; i++) {scanf("%d", &num[i]);}for (i = 0; i < k; i++) {if (num[i] >= 0 && num[i] < n) {//姓名 固话 手机 性别 生日printf("%s %s %s %c %i/%i/%i\n", inf[num[i]].name, inf[num[i]].guHua, inf[num[i]].phone, inf[num[i]].sex, inf[num[i]].date.year, inf[num[i]].date.month, inf[num[i]].date.day);}else {printf("Not Found\n");}}return 0;
}
- 答案
#include <stdio.h>
#define N 10struct Person {char name[11];char birthday[11];char sex;char fixed[17];char mobile[17];
};int main(void){struct Person p[N];int num[N];int i, n, k;scanf("%d", &n);for (i = 0; i < n; ++i){scanf("%s %s %c %s %s", &p[i].name, &p[i].birthday,&p[i].sex, &p[i].fixed, &p[i].mobile);}scanf("%d", &k);for (i = 0; i < k; ++i) {scanf("%d", &num[i]);}for(i = 0; i < k; ++i) {if (num[i] >= 0 && num[i] < n) {printf("%s %s %s %c %s\n", p[num[i]].name, p[num[i]].fixed, p[num[i]].mobile, p[num[i]].sex, p[num[i]].birthday);}else {printf("Not Found\n");}}return 0;
}
相关文章:
C语言进阶 11.结构体
C语言进阶 11.结构体 文章目录 C语言进阶 11.结构体11.1. 枚举11.2. 结构类型11.3. 结构与函数11.4. 结构中的结构11.5. 类型定义11.6. 联合11.7. PAT11-0. 平面向量加法(10)11-1. 通讯录的录入与显示(10) 11.1. 枚举 常量符号化: 用符号而不是具体的数字表示程序中的数字 cons…...
Vue--解决error:0308010C:digital envelope routines::unsupported
原文网址:Vue--解决error:0308010C:digital envelope routines::unsupported_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何解决node.js在运行Vue项目时的报错:error:0308010C:digital envelope routines::unsupported。 问题描述 使用node.js运行Vu…...
go-kratos 学习笔记(6) 数据库gorm使用
数据库是项目的核心,数据库的链接数据是data层的操作,选择了比较简单好用的gorm作为数据库的工具;之前是PHP开发,各种框架都是orm的操作;gorm还是很相似的,使用起来比较顺手 go-kratos官网的实例是ent&…...
记录:vite打包报错 error during build: Error: Parse error @:1:1
vant从3升级到4后,本地运行没问题, 但是打包就会报如下错误:error during build: Error: Parse error :1:1 一直以为是vant的问题,各种升级,替换插件,发现没什么用, 网上搜索了下,…...
Python 消费Kafka手动提交 批量存入Elasticsearch
一、第三方包选择 pip install kafka,对比了kafka和pykafka,还是选择kafka,消费速度更快pip install elasticsearch7.12.0(ES版本) 二、创建es连接对象 from elasticsearch import Elasticsearch from elasticsearch.helpers import bulkc…...
oracle 基础知识表的主键
一、表的约束条件 •约束条件是施加在表的字段上的一组限制条件,它使得只有符合限制条件要求的数据才能输入表。 •保证了表中的数据的正确性 i.约束条件包括了:非空和唯一和核对,即not null 和unique 和check null的含义:不确定 3个人去捡苹…...
opencascade AIS_MouseGesture AIS_MultipleConnectedInteractive源码学习
AIS_MouseGesture //! 鼠标手势 - 同一时刻只能激活一个。 enum AIS_MouseGesture { AIS_MouseGesture_NONE, //!< 无激活手势 // AIS_MouseGesture_SelectRectangle, //!< 矩形选择; //! 按下按钮开始,移动鼠标定义矩形&…...
Unity Apple Vision Pro 开发:如何把 PolySpatial 和 Play To Device 的版本从 1.2.3 升级为 1.3.1
XR 开发社区: SpatialXR社区:完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 📕教程说明 本教程将介绍如何把 Unity 的 PolySpatial 和 Play To Device 版本从 1.2.3 升级为 1.3.1。 📕Play To Device 软件升级 ht…...
大数据时代,区块链是如何助力数据开放共享的?
在大数据时代,区块链技术以其独特的优势,为数据开放共享提供了强有力的支持。以下是区块链助力数据开放共享的几个主要方面: 1. 增强数据安全性与隐私保护 加密安全:区块链技术采用先进的加密算法,如国密非对称加密技…...
睿抗2024省赛----RC-u4 章鱼图的判断
题目 对于无向图 G(V,E),我们将有且只有一个环的、大于 2 个顶点的无向连通图称之为章鱼图,因为其形状像是一个环(身体)带着若干个树(触手),故得名。 给定一个无向图,请你判断是不…...
py2exe,一个神奇的 Python 库
在众多Python打包工具中,py2exe无疑是一款出色的选择。它能够将Python脚本转换成可在Windows平台上独立运行的可执行文件,极大地方便了程序的分发与部署。本文将深入探讨py2exe的特性和使用方法,让你在创建桌面应用程序时更加游刃有余。 安装…...
博途PLC网络连接不上
博途PLC网络连接不上其中的一个原因就是网线接触不好,各种原因都试了,任然连接不上,大家可以把网线拔下,重新插拔或者直接更换一根网线。 1、无线网络网段和PLC连接网段冲突 。。。。...
哪个邮箱最安全最好用啊
企业邮箱安全至关重要,需保护隐私、防财务损失、维护通信安全、避免纠纷,并维持业务连续性。哪个企业邮箱最安全好用呢?Zoho企业邮箱,采用加密技术、反垃圾邮件和病毒保护,支持多因素认证,确保数据安全合规…...
企业微信开发智能升级:AIGC技术赋能,打造高效沟通平台
文章目录 一、AIGC在企业微信开发中的核心价值1. 智能化客服体验2. 自动化工作流程3. 个性化内容推荐4. 深度数据分析与洞察 二、使用AIGC进行企业微信开发的实践路径1. 需求分析与场景定义2. 技术选型与平台搭建3. 模型训练与调优4. 接口对接与功能集成5. 测试与优化 《企业微…...
Apache Doris + Paimon 快速搭建指南|Lakehouse 使用手册(二)
湖仓一体(Data Lakehouse)融合了数据仓库的高性能、实时性以及数据湖的低成本、灵活性等优势,帮助用户更加便捷地满足各种数据处理分析的需求。在过去多个版本中,Apache Doris 持续加深与数据湖的融合,已演进出一套成熟…...
Inno setup pascal编码下如何美化安装界面支持带边框,圆角,透明阴影窗口
inno setup自带的安装界面太老套了,如何实现类似网易,微信那种带界面的安装?一般有两种思路:提供一个单独的下载器,然后通过下载器将你用innosetup 打包后的软件下载下来,然后,静默安装这个包&a…...
SQL语句(以MySQL为例)——单表、多表查询
笛卡尔积(或交叉连接): 笛卡尔乘积是一个数学运算。假设我有两个集合 X 和 Y,那么 X 和 Y 的笛卡尔积就是 X 和 Y 的所有可能组合,也就是第一个对象来自于 X,第二个对象来自于 Y 的所有可能。组合的个数即为两个集合中…...
C++第二十八弹---进一步理解模板:特化和分离编译
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1. 非类型模板参数 2. 模板的特化 2.1 概念 2.2 函数模板特化 2.3 类模板特化 2.3.1 全特化 2.3.2 偏特化 2.3.3 类模板特化应用示例 3. …...
正则表达式的独占模式,懒惰模式等有那些区别
正则表达式的独占模式、懒惰模式(也称为非贪婪模式)和贪婪模式(默认模式)在匹配行为上存在显著的区别。以下是这三种模式的详细解释和区别: 1、贪婪模式(Greedy): 默认情况下&…...
【INTEL(ALTERA)】Quartus® Prime Pro Edition 软件 v24.2 中,哪些 Agilex™ 5 IP 功能的硬件验证有限?
目录 说明 解决方法 说明 如下表所示,Quartus Prime 专业版软件 24.2 版为 Agilex™ 5 IP 或功能提供有限的硬件支持。此外,设备的设备型号、比特流和固件尚未最终确定。 影响 Agilex™ 5 特定功能的已知问题可参阅 Agilex 5 知识库文章搜索。 解决…...
Lua编程
文章目录 概述lua数据类型元表注意 闭包表现 实现 lua/c 接口编程skynet中调用层次虚拟栈C闭包注册表userdatalightuserdata 小结 概述 这次是skynet,需要一些lua/c相关的。写一篇博客,记录下。希望有所收获。 lua数据类型 boolean , number , string…...
2019数字经济公测大赛-VMware逃逸
文章目录 环境搭建漏洞点exp 环境搭建 ubuntu :18.04.01vmware: VMware-Workstation-Full-15.5.0-14665864.x86_64.bundle 这里环境搭不成功。。patch过后就报错,不知道咋搞 发现可能是IDA加载后的patch似乎不行对原来的patch可能有影响,重新下了patch&…...
如何改桥接模式
桥接模式主要是解决 路由功能的 因为NAT多层 主要是网络连接数太多时 然后路由器要好 不然光猫 比差路由要强的 光猫 请注意,对光猫的任何设置进行修改前,请一定要备份光猫的配置文件,并在每次修改前都截图保存原始设置信息!不要…...
江科大/江协科技 STM32学习笔记P13
文章目录 TIM定时中断1、TIM简介计数器PSC预分频器ARR自动重装寄存器 2、定时器类型基本定时器主模式触发DAC 通用定时器高级定时器 3、定时器原理定时中断基本结构预分频器时序计数器时序RCC时钟树 TIM定时中断 1、TIM简介 定时器的基准时钟一般都是主频72MHz,如果…...
loadrunner录制解决提示安全问题
点击页面任意位置,输入: thisisunsafe...
为什么要读写分离?如何实现业务系统读写分离?
信息化水平提升,很多企业已经接受并高频使用多样的业务系统进行日常作业,而在不断的使用过程中,部分行业和业务,如:直播电商、基础制造、公关传媒等,由于自身特点的原因,常常积累了海量的数据。…...
C#基础——类、构造函数和静态成员
类 类是一个数据类型的蓝图。构成类的方法和变量称为类的成员,对象是类的实例。类的定义规定了类的对象由什么组成及在这个对象上可执行什么操作。 class 类名 { (访问属性) 成员变量; (访问属性) 成员函数; } 访问属性:public(公有的&…...
hadoop学习(二)
一.MapReduce 1.1定义:是一个分布式运算程序的编程框架 1.2核心功能:将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。 1.3优点 1)易于编程 它简单的实现一些接口&#…...
WXZ196微机消谐装置的运行方式了解一下
WXZ196微机消谐装置是一种用于抑制铁磁谐振的设备,可以在电力系统中快速消除各种频率的铁磁谐振,同时可以区分过电压、铁磁谐振以及单相接地,并给出相应的报警信号。该装置采用高速增强型单片机作为核心元件,对PT开口三角电压进行…...
单链表的建立
一.前言 单链表的建立一共有两种方法,一种是头插法,将元素插入在链表的头部,也叫前插法。另外一种则就是尾插法,将元素插入在链表尾部,也叫后插法。 二. 头插法 首先从一个空表开始,重复读入数据࿱…...
Shell脚本编程学习
IPv4和IPv6有什么区别? - 知乎 (zhihu.com) Shell 是一个命令解释权,它为用户提供了一个向 Linux 内核发送请求以便运行程序界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序。 可以查看当前系统的进程 ps -ef...
从宏基因组量化细菌生长动态
Introduciton 了解细菌在各种环境中的生长动态对于人类健康和环境监测等广泛领域至关重要。传统研究细菌生长的方法往往依赖于培养技术,这不仅耗时,而且对易培养的物种有偏向。然而,随着宏基因组测序技术的兴起,我们现在可以直接…...
Linux---git工具
目录 初步了解 基本原理 基本用法 安装git 拉取远端仓库 提交三板斧 1、添加到缓存区 2、提交到本地仓库 3、提交到远端 其他指令补充 多人协作管理 windows用户提交文件 Linux用户提交文件 初步了解 在Linux中,git是一个指令,可以帮助我们做…...
【JavaScript】函数的动态传参
Javacript(简称“JS”)是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。虽然它是作为开发Web页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,JavaScript基于原型编程、多范式的动态脚本语言&…...
从0到1,AI我来了- (4)AI图片识别的理论知识-II
上篇文章,我们理解了我们程序的神经网络设计,这篇我们继续,把训练迭代过程分析一下,完成这两篇文章,下面问题,应该能回答了。 一张图片,如何被计算机读懂?pytorch 封装的网络&#…...
2024 Java 高分面试宝典 一站式搞定技术面
前言 每年9月和10月,被业界称为“金九银十”,这是人才市场一年中最活跃的时期。此时,企业为了来年的业务扩展,纷纷加大招聘力度,空缺岗位众多,招聘需求集中。同时,初秋的招聘活动也避开酷暑&am…...
MongoDB - 聚合操作符 $eq、$gte、$in、$sum、$avg
文章目录 1. $eq2. $gte3. $in4. $sum5. $avg 1. $eq $eq比较两个值并返回:true (当值相等时)|false(当值不相等时) { $eq: [ <expression1>, <expression2> ] }构造测试数据: db.inventory…...
C语言 | Leetcode C语言题解之第279题完全平方数
题目: 题解: // 判断是否为完全平方数 bool isPerfectSquare(int x) {int y sqrt(x);return y * y x; }// 判断是否能表示为 4^k*(8m7) bool checkAnswer4(int x) {while (x % 4 0) {x / 4;}return x % 8 7; }int numSquares(int n) {if (isPerfect…...
在appium中,如何通过匹配图片来进行断言?
在Appium中进行图片匹配断言,可以使用OpenCV来实现。以下是使用Appium和OpenCV进行图片匹配断言的示例代码。 首先,需要确保安装了必要的库: pip install opencv-python-headless pip install opencv-python pip install numpy然后…...
昇思25天学习打卡营第21天|CV-Shufflenet图像分类
打卡 目录 打卡 ShuffleNet 网络介绍 ShuffleNet 模型架构 Pointwise Group Convolution Channel Shuffle ShuffleNet模块 ShuffleNet 模块代码 构建ShuffleNet网络 模块代码 模型训练和评估 模型训练 模型评估 模型预测 ShuffleNet 网络介绍 ShuffleNetV1是旷视科…...
python 图片转文字、语音转文字、文字转语音保存音频并朗读
一、python图片转文字 1、引言 pytesseract是基于Python的OCR工具, 底层使用的是Google的Tesseract-OCR 引擎,支持识别图片中的文字,支持jpeg, png, gif, bmp, tiff等图片格式 2、环境配置 python3.6PIL库安装Google Tesseract OCR 3、安…...
SSRF (服务端请求伪造)
🎼个人主页:金灰 😎作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️ 🍊易编橙终身成长社群&#…...
SQL中的LEFT JOIN、RIGHT JOIN和INNER JOIN
在SQL中,JOIN操作是连接两个或多个数据库表,并根据两个表之间的共同列(通常是主键和外键)返回数据的重要方法。其中,LEFT JOIN(左连接)、RIGHT JOIN(右连接)和INNER JOIN…...
[网鼎杯 2020 朱雀组]Nmap(详细解读版)
这道题考察nmap的一些用法,以及escapeshellarg和escapeshellcmd两个函数的绕过,可以看这里PHP escapeshellarg()escapeshellcmd() 之殇 (seebug.org) 两种解题方法: 第一种通过nmap的-iL参数读取扫描一个文件到指定文件中第二种是利用nmap的参数写入we…...
【React】详解“最新”和“最热”切换与排序
文章目录 一、基本概念和初始化二、切换与排序功能的实现1. 函数定义和参数2. 设置活动 Tab3. 定义新列表变量4. 根据排序类型处理列表4.1 按时间降序排序4.2 按点赞数降序排序 5. 更新评论列表 三、渲染导航 Tab 和评论列表1. map 方法2. key 属性3. className 动态赋值4. onC…...
BUUCTF [MRCTF2020]Ezpop
这道题对于刚接触到pop链的我直接把我整懵了,一边看着魔术方法一边分析 魔术方法可以看这里PHP 魔术方法 - 简介 - PHP 魔术方法 - 简单教程,简单编程 (twle.cn) 代码解析 经过以上的分析我们可以理一下解题思路:接收参数反序列化之前先触发…...
RV1126 Linux 系统,接外设,时好时坏(一)应该从哪些方面排查问题
在 Linux 系统中接外设时,遇到“时好时坏”的问题,可能是由多种因素引起的。以下是一些排查问题的建议。 1. 硬件方面的排查 1.1 连接检查 物理连接: 确保外设与主板之间的连接良好,检查插头、插座及线缆是否牢固。引脚配置: 确认设备树中引脚的配置是否正确,尤其是引脚…...
Vue实现简单小案例
一、创建文件夹 二、引用vue.js <script src"../js/vue.js"></script> 三、准备一个容器 <div id"app"><h1>Hello,{{name}}</h1> </div> 四、创建实例 <script>new Vue({el:"#app", //el用于指…...
【MATLAB APP】建立独立桌面APP
背景:已有MATLAB APP的.mlapp文件,但客户提出需要可以直接使用的exe文件。 要求:点开即用,无需下载MATLAB。使用者无法修改APP的代码。 一、环境配置 APP创建者:安装MATLAB R2023a,配置Application Compile…...
Spring的优缺点?
Spring的优缺点 直接回答相关的Spring的特点: IOC AOP 事务 简化开发: 容易集成JDBCTemplateRestTemplate(接口远程调用)邮件发送相关异步消息请求支持 更加深入就讲源码了 优点: 方便解耦,简化开发…...