跪求C语言编写的万年历原代码,大哥们帮帮忙啊~

跪求C语言编写的万年历原代码,大哥们帮帮忙啊~,第1张

分类: 电脑/网络 >> 程序设计 >> 其他编程语言

问题描述:

有点要求~1当前页以系统当前日期的月份为准显示当前月的每一天(显示出日及对应的星期几) 2当系统日期变到下一月时,系统自动翻页到下一月谢谢啦~救命啊最好用TC编的,谢谢啦

解析:

-------------系统库定义-------------------

#include "stdioh"

#include "BIOSh"

#include "dosh"

#define X " Sun Mon Tue Wed Thu Fri Sat"

#define LEFT 0x4b00

#define RIGHT 0x4d00

#define DOWN 0x5000

#define UP 0x4800

#define PGUP 0x4900

#define PGDW 0x5100

#define ESC 0x011b

#define QUERY 0x1071

#define QUERYD 0x1051

--------------------------------------------

struct date dm ;时间结构定义

int Cyear,Cmonth,Cday,Cmonnum,Lmonnum ;全局变量

int isleap(int year)判断闰年

{

if(year%4==0&&year%100||year%400==0)

return 1 ;

else

return 0 ;

}

int getday(int year,int month,int day)计算X年X月X日是星期几

{

int flag,s,i ;

int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31} ;

int cont=0 ;

flag=isleap(year);

if(flag==1)

a[2]++;

for(i=1;i<month;i++)

{

cont=cont+a[i];

}

cont=cont+day ;

s=year+1+(year-1)/4+(year-1)/100+(year-1)/400+cont ;

return s%7 ;

}

void printspace(int n)输出空格

{

int i ;

for(i=0;i<n;i++)printf(" ");

}

void spacer()输出分隔符(分隔线)

{

int i ;

for(i=0;i<30;i++)

{

printf("=");

}

printf("\n");

}

void keyinfo()输出键盘 *** 作信息

{

printf("\n-------Operation manual-------\n");

printf("Year:Up key and Down key\n");

printf("Month:Left key and Right key\n");

printf("Day:PageUp key and PageDown key\n");

printf("Query date of the calendar:Q key\n");

printf("Exit calendar:Esc key\n");

}

void week()输出当前日期是星期几

{

int day ;

day=getday(Cyear,Cmonth,Cday);

if(day==0)

printf("\n%d-%d-%d is Sunday!\n",Cyear,Cmonth,Cday);

if(day==1)

printf("\n%d-%d-%d is Monday!\n",Cyear,Cmonth,Cday);

if(day==2)

printf("\n%d-%d-%d is Tuesday!\n",Cyear,Cmonth,Cday);

if(day==3)

printf("\n%d-%d-%d is Wednesday!\n",Cyear,Cmonth,Cday);

if(day==4)

printf("\n%d-%d-%d is Thursday!\n",Cyear,Cmonth,Cday);

if(day==5)

printf("\n%d-%d-%d is Friday!\n",Cyear,Cmonth,Cday);

if(day==6)

printf("\n%d-%d-%d is Saturday!\n",Cyear,Cmonth,Cday);

}

void calendar(int year,int month,int day)显示日历

{

int i,j,d,m,flag,week;

int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

m=0,d=0,week=0;

Cmonnum=a[month];当前月的天数

Lmonnum=a[month-1];上一月的天数

week=d=getday(year,month,1);取得X年X月的1日是星期几

flag=isleap(year);

if(flag==1)

{

a[2]++;

}

clrscr();

printf("\n The calendar of year %d\n",year);

spacer();

switch(month)

{

case 1 :

printf(" January 1 ");

break ;

case 2 :

printf(" February 2 ");

break ;

case 3 :

printf(" March 3 ");

break ;

case 4 :

printf(" April 4 ");

break ;

case 5 :

printf(" May 5 ");

break ;

case 6 :

printf(" June 6 ");

break ;

case 7 :

printf(" July 7 ");

break ;

case 8 :

printf(" August 8 ");

break ;

case 9 :

printf(" September 9 ");

break ;

case 10 :

printf(" October 10 ");

break ;

case 11 :

printf(" Nevember 11 ");

break ;

case 12 :

printf(" December 12");

break ;

}

printf("\n");

printf(X);

printf("\n");

for(i=0;i<6;i++)

{

if(i==0)如果是第一个星期时,执行!

{

printspace(d4);

for(j=0;j<7-d;j++)

{

if(m==day-1)m到达day的前一天时,输出[%d]

{

printf(" [%d]",++m);

}

else if(m==day && week!=0)m到达当天时的,输出%3d

{

printf("%3d",++m);

}

else

{

printf("%4d",++m);

}

week=(week<6)week+1:0;计算当天是星期几

}

printf("\n");

}

else不是第一个星期时,执行!

{

for(j=0;j<7;j++)

{

if(m<a[month])

{

if(m==day-1)m到达day的前一天时,输出[%d]

{

if(m<9)代表只有一位数的数字如9,8,7等。

printf(" [%d]",++m);

else代表只有两位数的数字如10,11,12等。

printf(" [%d]",++m);

}

else if(m==day && week!=0)

{

printf("%3d",++m);

}

else

{

printf("%4d",++m);

}

}

week=(week<6)week+1:0;计算当天是星期几

}

printf("\n");

if(m==a[month])break ;

}

}

spacer();

if(flag==1)

printf("\nThe year %d is leap year!\n",year);

if(flag==0)

printf("\nThe year %d is not leap year!\n",year);

week();

printf("\nThe current date is: %d-%d-%d\n",dmda_year,dmda_mon,dmda_day);

keyinfo();

}

keyboard Operation

void key()

{

int key ;

Cyear=dmda_year,Cmonth=dmda_mon,Cday=dmda_day ;

calendar(Cyear,Cmonth,Cday);

while(1)

{

key=bioskey(0);

if(key==RIGHT)

{

if(Cmonth<12&&Cmonth>=1)

{

Cmonth++;

}

else

{

Cyear++;

Cmonth=1 ;

}

}

if(key==LEFT)

{

if(Cmonth<=12&&Cmonth>1)

{

Cmonth--;

}

else

{

Cyear--;

Cmonth=12 ;

}

}

if(key==UP)

{

Cyear++;

}

if(key==DOWN)

{

Cyear--;

}

if(key==PGUP)

{

if(Cday!=1)

{

Cday--;

}

else if(Cday==1&&Cmonth==1)

{

Cyear--;

Cmonth=12 ;

Cday=31 ;

}

else

{

Cmonth--;

Cday=Lmonnum ;

}

}

if(key==PGDW)

{

if(Cmonnum!=Cday)

{

Cday++;

}

else if(Cmonnum==Cday&&Cmonth==12)

{

Cyear++;

Cmonth=1 ;

Cday=1 ;

}

else

{

Cmonth++;

Cday=1 ;

}

}

if(key==QUERY||key==QUERYD)

{

printf("Input date format(YYYY,MM,DD):");

scanf("%d,%d,%d",&Cyear,&Cmonth,&Cday);

}

if(key==ESC)break ;

calendar(Cyear,Cmonth,Cday);

}

}

void main()

{

clrscr();

getdate(&dm);

key();

}

1、计算线路长度(米)

SELECT patrolid, st_length(ST_Transform(geom,3857))

FROM publicpatrolrecord where patrolid='3d4f8e0d-e759-469f-b78e-50f6445b56c9'

ST_Area(ST_Transform(geom,3857))

2、空间相交计算

判断点是否在面内:

select ST_DWithin(ST_SetSRID(ST_MakePoint(117272031,31868486),4326),(SELECT geom from sxkwg where xzqhcode='340103009'),0)

3、矩形查询

_st_intersects(st_transform(ST_MakeEnvelope(" + leftTopX + "," + leftTopY + "," + rightBottomX + "," + rightBottomY + ",4326" + "),4326),geom)

4、多边形查询

SELECT gid,year,cc,gb,ec,name,type,cc,gb,ec,name,type,st_astext(geom) wkt FROM V_ARCP where ST_Intersects(st_geometryfromtext('wkt',4326), geom) and year='2017'

5、根据已存在经纬度字段更新geometry字段

update map_thematicinfo set geom =ST_SetSRID(ST_MakePoint(longitude,altitude),4326) where gid=138

6、查询两点之间的距离(获取面状要素几何中心)

select jdm,st_distance(ST_Centroid(geom),ST_GeomFromText('POINT(11712927656982 319223723088035)',4326),true) as distance from jzw order by distance asc limit 5

7、合并多个几何对象

update tb_duty_area set geom=SELECT st_union(geom) from tb_duty_area where (uid=49 or uid =107) WHERE uid=363

并行查询使用多个后台进程,但后端进程基本上处理连接的客户端发出的所有查询。改后端有五个子系统组成。

解析器生成一个解析树,后续子系统可以从纯文本的 SQL 语句中读取该解析树。

如下面的查询:

解析树是其根节点是定义在 parsenodesh中的 [SelectStmt](javascript:void(0))结构的树。

SELECT 查询的元素和解析树的相应元素编号相同。例如,(1) 是第一个目标列表的一个项目,它是表的“id”列,(4) 是 WHERE 子句,依此类推。

由于解析器在生成解析树时只检查输入的语法,因此只有在查询中出现语法错误时才会返回错误。

解析器不检查输入查询的语义。例如,即使查询包含不存在的表名,解析器也不会返回错误。语义检查由分析器/分析器完成。

分析器运行由解析器生成的解析树的语义分析并生成查询树。

查询树的根是定义在 parsenodesh中的 [查询](javascript:void(0))结构;此结构包含其相应查询的元数据,例如此命令的类型(SELECT、INSERT 或其他)和几个叶子;每个叶子形成一个列表或树,并保存各个特定子句的数据。

述查询树简述如下。

重写器是实现 规则系统 的系统,必要时根据存储在 pg_rules系统目录中的规则变换查询树。

PostgreSQL 中的视图 是使用规则系统实现的。当视图由 CREATE VIEW 命令定义时,相应的规则会自动生成并存储在目录中。

假设已经定义了以下视图,并且对应的规则存储在 pg_rules 系统目录中。

当发出包含如下所示视图的查询时,解析器将创建解析树,如图所示。

在这个阶段,重写器将范围表节点处理为子查询的解析树,即对应的视图,存储在 pg_rules 中。

计划器从重写器接收查询树并生成可以由执行器最有效地处理的(查询)计划树。

PostgreSQL 中的计划器是基于纯成本优化的;它不支持基于规则的优化和提示。这个规划器是 RDBMS 中最复杂的子系统

与其他 RDBMS 一样,PostgreSQL 中的 EXPLAIN命令显示计划树本身。 如下所示。

他对应的计划树:

每个计划节点都有执行器需要处理的信息,单表查询的情况下,执行器从计划树的末端到根进行处理。

PostgreSQL 的查询优化是基于成本的。成本是无量纲值,它们不是绝对的绩效指标,而是比较运营相对绩效的指标。成本由 costsizec 中定义的函数估算。执行器执行的所有 *** 作都有相应的成本函数。例如,顺序扫描和索引扫描的成本分别由 cost_seqscan() 和 cost_index() 估算。

有三种成本,启动成本,执行成本以及总成本。其中总成本 = 启动成本 + 执行成本。

顺序扫描的成本由 cost_seqscan() 函数估算。

其中 seq_page_cost 、 cpu_tuple_cost 和 cpu_operator_cost 在 postgresqlconf 文件中设置,默认值分别为 10 、 001 和 00025 ,Ntuple和Npage分别是该表的所有元组和所有页的编号。

从运行成本估算可以看出,PostgreSQL 假设所有页面都将从存储中读取;也就是说,PostgreSQL 不考虑扫描的页面是否在共享缓冲区中。

虽然 PostgreSQL 支持 一些索引方法 ,例如 BTree、 GiST 、 GIN 和 BRIN ,但索引扫描的成本是使用常见的成本函数估算的:cost_index()。

索引扫描的启动成本是读取索引页以访问目标表中第一个元组的成本,它由以下等式定义:

Hindex是索引树的高度。

索引扫描的运行成本是表和索引的 cpu 成本和 IO(输入/输出)成本之和:

前三个成本定义如下:

其中 cpu_index_tuple_cost 和 random_page_cost 在 postgresqlconf 文件中设置(默认分别为 0005 和 40); qual_op_cost粗略来说就是指数的评估成本,值为00025。选择性选择性是指定WHERE子句对索引的搜索范围的比例;它是一个从 0 到 1 的浮点数

查询谓词的选择率是通过直方图界值与高频值估计的,这些信息都储存在系统目录pg_staticstics中,并可通过pg_stats视图查询。

表中的每一列的高频值都在pg_stats视图的most_common_vals和most_common_freqs中成对存储。

排序路径会在排序 *** 作中被使用。排序 *** 作包括order by、归并连接的预处理 *** 作,以及其他函数。函数cost_sort()用于估计排序 *** 作的代价。如果能在工作内存中放下所有元组,那么排序 *** 作会选用快速排序算法。否则就会创建临时文件,使用文件归并排序算法。

排序路径的启动代价就是对目标表的排序代价,因此代价就是O(Nsort) Log 2 (Nsort),这里Nsort就是带排序的元组数。排序路径的运行代价就是读取已经排序好的元组的代价,因此代价就是O(Nsort)。

PostgreSQL中的计划器会执行三个步骤:

访问路径是估算代价时的处理单元。比如顺序扫描、索引扫描、排序,以及各种连接 *** 作都有其对应的路径。访问路径只在计划器创建查询计划树的时候使用。最忌本的访问路径数据结构就是relationh中定义的path结构体,相当于顺序扫描。所有其他的路径访问都基于该结构。

在创建计划树之前,计划器将线对PlannerInfo中的查询书进行一些预处理。预处理有很多步骤,本节值讨论和单表查询处理相关的主要步骤。

计划器对所有可能的访问路径进行代价估计,然后选择代价最小的那个。

在最后一步中,计划器按照代价最小的路径生成一颗计划树。

计划树的根节点是定义在plannodesh中的Plannedstmt结构,包含19个字段,其中有4个代表性字段:

计划树包含各式各样的计划节点。PlanNode是所有计划节点的基类,其他计划节点都会包含PlanNode结构。比如顺序扫描节点SeqScanNode包含一个PlanNode和一个整型变量scanrelid。PlanNode包含14个字段,下面是7个代表性字段:

在单表查询的例子中,执行器从计划树中取出计划节点,按照自底向上的顺序进行处理,并调用节点相应的处理函数。

每个计划节点都有相应的函数,用于执行节点对应的 *** 作。这些函数在src/backend/executor目录中。

理解执行器如何工作的最好方式,就是阅读explain命令的输出。

我们可以自底向上阅读explain的结果,来看一看执行器是如何工作的。

第六行:首先,执行器通过nodeSeqscanc中定义的函数执行顺序扫描 *** 作。

第四行:然后,执行器通过nodeSortc中定义的函数,对顺序扫描的结果进行排序。

执行器在处理查询时会使用工作内存和临时缓冲区,两者都在内存中分配。如果查询无法在内存中完成,就会用到临时文件。

使用带有Analyze选项的explain,待解释的命令会真正执行,并显示实际结果行数、实际执行时间和实际内存使用量。

在第6行,explain命令显示执行器使用了10000KB的临时文件。临时文件会被临时创建在base/pg_tmp子目录中,并遵循如下命令规则:{“pgsql_tmp”}+ {创建本文件的postgres进程pid}{从0开始的序列号}

比如,临时文件pgsql_tmp89035是pid为8903的postgres进程创建的第6个临时文件。

PostgreSQL中支持三种连接 *** 作,分别是嵌套循环连接,归并连接和散列连接。在pg中,嵌套循环连接和归并连接有几种变体。

这三种连接方式都支持pg中所有的连接 *** 作,注入inner join、 left/right outer join、 full outer join等。

循环嵌套连接不需要任何启动代价,因此:start-up cost = 0

运行代价和内外表尺寸的乘积成比例,即run cost是O(Nouter Ninner), Nouter和Ninner分别是外表和内表的元组条数。run cost的定义如下:

Couter和Cinner分别是内表和外表顺序扫描的代价。

循环嵌套连接的代价总会被估计,但实际中很少会使用这种连接 *** 作,因为它有几种更高效的变体。

在上面描述的循环嵌套连接中,每当读取一条外表中的元组时,都需要扫描内标中的所有元组。位每条外表元组对内标做全表扫描,这一过程代价高昂,pg支持一种物化嵌套循环连接,可以减少内标全表扫描的代价。

在运行嵌套循环连接之前,执行器会使用临时元组存储模块对内表进行一次扫描,将内表元组加载到工作或临时文件中。在处理内表元组时,临时元组存储比缓冲区管理器更为高效,特别是当所有的元组都能放入工作内存中。

qg内部提供了临时元组存储的模块,可用于各种 *** 作,如五花膘、创建混合散列连接的批次等。该模块包含一系列函数,都在tuplestorec中。这些函数用于从工作内存或临时文件读写元组。该工作内存还是临时文件取决于待存储元组的总数。

上面显示了执行器要进行的 *** 作,执行器对这些计划节点的处理过程如下:

第7行:执行器使用顺序扫描,物化内部表tbl_b。

第4行:执行器执行嵌套循环连接 *** 作,外表是tbl_a,内表是物化的tbl_b。

如果内表上有索引,且该索引能用于搜索满足连接条件的元组,那么计划器在外外表的每条元组搜索内标中的匹配元组时,会考虑使用索引进行直接搜索,以替代顺序扫描。这种变体叫做索引嵌套循环连接,如下图所示。虽然这种变体叫做“索引嵌套循环连接”,但是谁该算法基本上只需要在外表上循环一次,因此连接 *** 作的执行非常高效。

与嵌套循环连接不同的是,归并连接只能用于自然连接与等值连接。

函数initial_cost_merge_join()和final_cost_merge_join()用于估计归并连接的代价。

归并连接的启动成本是内表与外表排序成本之和,因此其启动成本为:

这里Nouter和Ninner分别是外表和内标的元素条数,而运行代价是O(Nouter + Ninner)。

下图是归并连接的示意图。

如果所有元组都可以存储在内存中,那么排序 *** 作就能在内存中进行,否则就是用临时文件。

第9行:执行器对内表tbl_b进行排序,使用顺序扫描(第11行)。

第6行:执行器对外表tbl_a进行排序,使用顺序扫描(第8行)。

第4行:执行器执行归并连接 *** 作,外表是排序好的tbl_a,内表是排好序的tbl_b。

与嵌套循环连接类似,归并连接还支持物化归并连接,物化内表,使内表扫描更为高效。

下面是物化归并连接的explain结果,很容易发现,与普通归并连接的差异是第9行:Materialize。

与归并连接类似,hash连接只能用于自然连接与等值连接。

PostgreSQL中的散列连接的行为因表的大小而异。如果布标足够小(确切的说,内表大小不超过工作内存的25%),那么hash连接就是简单的两阶段内存hash连接,否则将会使用带倾斜批次的混合hash连接。

内存中的hash连接是在work_mem中处理的,在pg中,散列表区域被称作处理批次。一个批处理批次会有多个散列槽,内部称其为桶,桶的数量由nodeHashc中定义的ExecChooseHashTableSize()函数所确定。桶的数量是2的整数次幂。

内存散列连接有两个阶段,分别是构建阶段和探测阶段。在构建阶段,内存表中的所有元组都会被插入到处理批次中;在探测阶段每条腕表元组都会与处理批次中的内表元组比较,如果满足连接条件,则将两条元组连接起来。

当内表的元组无法全部存储在工作内表中的单个处理批次时,pg使用带倾斜批次的混合散列连接算法,该算法时混合散列连接诶的一种变体。

在第一个构建和探测阶段postgresql准备多个批次,宇通的数目类似,处理批次的数据由函数ExecChooseHashTableSize()决定,也就是2的整数次幂。工作内存中智慧分配一个处理批次,而其他批次都以临时文件的形式创建。属于这些批次的元组将通过临时元组存储功能被写入到相应的文件中。

为了获取最佳计划树,计划器必须考虑各个索引与各种连接方法之间的所有可能组合。如果表的数量超过某个水平,该过程的代价就会因为组合爆炸而变得非常昂贵,以至于根本不可行。

如果表的数量小于12张,计划器可以使用动态规划来获取最佳计划。

《潮人 篮球 》中控球后卫PG,顾名思义是拥有控球,这里的控球包括抢断能力,通过抢断等方式获取球权并通过妙传辅助队友进攻,自身得分能力一般不强, 控卫一共拥有17种普通技能,10种花式被动。

控球后卫PG技能选择推荐

PG(控卫)的普通技能如下:

在普通技能的选择上新手可以尝试佩带:鱼跃扑球、冲抢、换手变向突破、闪电投篮、超级传球、干扰。

1、鱼跃扑球(必带):PG核心技能,抢夺地板球必备,可有效地争取篮板、盖帽、抢断后的球权。

2、冲抢(必带):虽然冲抢技能有较高的失位风险,但对于高抢断值的PG来说,能够进行有效抢断是球员的必备能力。

3、换手变向突破(推荐):结合PG自身的高跑动,可以有效地制造空位进行投篮进攻。

4、闪电投篮(推荐):配合传球的快速得分技能,能够有效地提升PG得分能力。

5、超级传球(必带):配合自身高传球值,实现妙传几率的最大化,提升团队实力。

6、干扰(推荐):PG需要面对的多是SF、PG、SG,佩带干扰技能能有效地干扰对方得分。

上述技能组合适合新手,在技能选择上适配于PG高抢断、高运球的基础数值。大家在熟悉PG数值特点后,也可以通过潜能、徽章加点改变PG的成长路线,佩带更多投篮技能使其成球强大的进攻投手。

对于花式被动(如下图):

推荐佩带小鸟跳投、街舞突破或者拜佛突破、不屈防守等,可适当的增强PG的投篮以及突破能力、身体对抗能力。

最后三位,Excel想要取一列数的前几位,可以用公式left,比如你想取一列数的前两位,可以先选中那一列数,然后输入公式=LEFT(A2,2),最后按回车键就可以得出提取结果,然后把鼠标放在第一列上面,下拉填充公式,所有那一列就都是提取了这一列的前两位。

2 excel取特定字符后几位

excel中如何提取单元格中第三个特定字符后面的字符?

在EXCEL工作中常常需要提取特殊符号后的字符,介绍2种常用方法,希望能够帮到你。

场景一:单元格内仅有一个特殊符号解决方法:利用函数

比如下面的中,E列的单元格内容中均有特殊符号,特殊符号后又有需要的文字。

这时我们先选中需要的单元格→然后在编辑栏中输入函数=MID(E6,FIND("/",E6)+1,99) →单击enter,即可得出前一列单元格中特殊符号后的字符。

以上就是关于跪求C语言编写的万年历原代码,大哥们帮帮忙啊~全部的内容,包括:跪求C语言编写的万年历原代码,大哥们帮帮忙啊~、PG+PostGIS 空间函数查询、pg查询处理流程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9434003.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存