从构建一个Date类入门C++类与对象
类的定义12345678910111213141516171819class Date{public: void Init(int year = 1,int month = 1,int day = 1) { _year = year; _month = month; _day = day; } void Print() { cout << _year << ":" << _month << ":" << _day << endl; }private: int _year; int _month; int _day;};
抽象数据类型(类)通过如上代码,我们就在源代码中通过class声明了一个抽象数据类型Date,简称类,那么封装一个类有什么好处呢?好处是类把相关的操作分为两类:
类的设计者:负责考虑类的具体 ...
指针详解
这篇质量不太行:(
内存和地址在了解指针之前,先讲讲内存是如何管理的
首先因为内存很大(一般有几个G),所以为了高效管理,有了内存单元的概念。而这个单元的大小,正好是一个字节。
因为一个比特位就是一个二进制位,太小了,超过一个字节,在处理char这样一个字节长的变量很麻烦。
定下长度后,就可以给内存单元编号,而每个内存单元获得的独一无二的编号,便是它的地址,以声明了一个变量a为例,示意图如下
变量的地址上图中a占4个字节,每个字节都有自己的地址,但要找到a其实只需要找到第一个地址就行了,实际上在C语言中也是如此,a的地址就是首字节地址,即图中的0x000000AF88DFF6A4
关于几个名词在C语言中称地址为指针,储存地址的变量叫指针变量,平时也简称指针,此时强调的是指针变量里储存的地址,而不是这个变量。
指针变量的组成指针变量也要拆成两部分来看
一个是变量的值,在同一个程序中,所有指针变量的值的长度都是一样的,都指向了某一个内存中的字节, 至于具体多长,取决于环境:32位程序是4个字节,64位程序是8个字节
另一个是变量的类型,类型决定编译器从值所指向的字节,向后总共读几个字节 ...
=C入门=深入研究 字符串与字符数组
什么是字符串初见字符串我们最先遇到的字符串,一般是hello_world程序中用到的"hello world",也就是两个双引号括起来的一串字符,输出时的占位符是%s,可以直接拿去传值,代码如下
1printf("%s","hello world");
声明字符串变量有时我们想要先把字符串存起来,再进行操作,那么就使用字符数组,并在初始化的时候把字符串传给它,这样在创建数组时会编译器会自动分配内存给它,代码如下
1char str[] = "abcdef";
此时我们也可以开启VS的调试,并打开内存和监视窗口观察字符串是如何在内存中储存的,如下图
通过观察可以发现,C语⾔字符串的字符串有个规定(特点),就是以字符\0结尾,无论是初始化数组时,还是在分配内存时,都有\0的位置。
strlen()函数依据以\0为字符串结尾的规则,strlen函数就可以计算字符串的长度,它会从字符串的第一个字符向后扫描,直到遇到\0结束,且\0不进入计数,最后返回字符串的长度,代码如下
1234#include <st ...
=C语言实践= 手把手教你做高端cmd简单扫雷
直接开始吧!多文件项目扫雷项目内容较多,需要调用的函数也较多,采用多文件的方式,可以使代码条理清晰,并且易于管理和维护。文件如下
game.h用于宏定义,函数声明,引入头文件等
game.c用于函数的具体实现
front.c用于实现程序的主干部分
other.c用于实现其他杂项函数,这里我用于实现menu()函数,主要内容太花了
注 .c结尾的源文件均需加一句#include "game.h"
头文件本次用到的头文件有stdio.h stdlib.h time.h windows.h和自己建的game.h
均在文件game.h中#include
define宏定义为了便于阅读和维护代码,在game.h中的宏定义如下
1234567891011121314151617181920//显示行列#define ROW 9#define COL 9//实际数组大小#define ROWS ROW+2#define COLS COL + 2//地雷信息#define Bomb '*'#define Blank ' '//难度#defi ...
玩转N组输入和多组输入
引入当我们在写IO型OJ时,多组输入便是我们绕过不开的话题了,但不用担心,可能初见多组输入会觉得难以理解,但用多了之后就会发现,多组输入 花样并不多,混熟了就很简单了
先看看一组输入输出如何完成的
如图:一组输入时,用scanf获取一组输入,并在主体部分完成数据的处理,产生结果,最后用printf输出产生的一组结果。
以下用实现加法的程序做演示
12345678910#include <stdio.h>int main(){ int a,b; scanf("%d %d",&a,&b);//获取一组输入 int sum = a + b;//产生结果 printf("%d\n",sum);//输出结果 return 0;}
然后升级到N组输入有的OJ题在一个测试文件中会先输入一个n,告诉你接下来有n组输入,你就要产生n组输出,也就是说要将一组输入输出重复性地完成n次。难道我们要把代码重复n次吗?显然不现实。
所以是时候使用循环了,具体用法如下
如图,先用一个scanf获 ...
=C语言= 整型变量与过大的整数
整型家族在使用C语言写程序时,会储存各种长度的整型,而在整型家族中,长度的比较如下
char < short <= int <= long <long long
整型是如何储存在内存中的以char为例
char的长度为1个字节,8个比特位,其中最高位是符号位,0表示正数,1表示负数,剩下的位数用于储存变量的绝对值
而当使用无符号整型(带前缀unsigned)时,只需把符号位也用于存值即可
能够储存的最大正整数int长度为4字节,能够储存的最大值为2的31次方-1,即2,147,483,647
unsigned int能够储存的最大值为4294967295
unsigned long long长度为8字节,能够储存的最大值为2的64次方-1,即18,446,744,073,709,551,615
限制虽然unsigned long long已经很大了,但当遇到指数,阶乘之类的运算时仍然可能存不下!(光21!就比unsigned long long长了)
思路过大的整数,可能出现在程序的过程中,也可能出现在输出中,对于过程,可以尝试改变实现思路,让过程中不出现 ...
如何在VS里使用scanf
VS里怎么连scanf都用不了?不少刚接触Visual Studio的可能发现使用scanf会报错(如下)
vs告诉你说scanf不安全,然后你会发现vs给你提供了scanf_s去代替scanf,但是,只有vs能编译scanf_s,可移植性太差了,所以我们要用回scanf,所以要怎么不让它报错呢?可以在源文件开头添加一行宏定义(如下)
#define _CRT_SECURE_NO_WARNINGS 1
这样就能关闭报错了,但请先别急着走,每次都要复制粘贴一句宏定义太麻烦了,想一劳永逸的请往下看。
修改newc++file.cpp来自动添加宏定义先来看怎么做:首先搜索找到电脑中叫做newc++file.cpp的文件。(这里推荐使用everything)
后半段路径应与图片一致,注意不是快捷方式
注意:由于权限原因,无法直接修改此文件
所以先将这个文件复制粘贴到别处,例如桌面,下文用副本代称。
用记事本类软件(记事本就行)打开副本,在第一行输入上文提到的宏定义代码#define _CRT_SECURE_NO_WARNINGS 1,然后ctrl+s保存。
关闭编辑窗口,将该副本移 ...
=回顾-前端=从简陋的html到单网页再到全栈开发
👉点我去作业一
👉点我去作业二
👉点我去作业三(抱歉,还没部署到服务器里,这个只能在我自己的电脑里用)
👉点我去作业四
其实这依然是个博客
粗糙的作业一当时只学过html,css,js的快速入门,对盒子<div>的玩法还不太熟,还只会用浮动盒子float和绝对定位,结局就是写两句html就得清除浮动233,甚至<lenged>也不认识,结果手动用css给实现了。总之就挺简陋的
精致(并不)作业二用vscode写作业二的时候,写一半发现鼠标悬停在tag时,它会给出去往MDN对应参考页的连接,然后就开始一边写一边阅读MDN,结果一发不可收拾,开始读的时间比写的时间还长。最后成功学到神器bushiflex弹性盒子模型。。
但还没完,除了参阅文档,我还多次在B站首页和MC百度百科首页打开F12,查看,学习他们是如何布局盒子的,别说,学成品也挺有用的,对盒子的排版,嵌套的想法成熟多了
结合二者,照着图片做一个网页便没什么问题了。那个作业二我甚至直接弃掉了初版(已经把顶部做好了)version2基本完全采用flex盒子。比较遗憾的是,虽然每个菜单按钮都加了超链接, ...
=算法=双指针的种种应用(更新中)
注:本文写于C语言学习早期,双指针的用法较为基础且不全面。本文章将涉及C语言数组至数据结构的链表
Q:为什么要用双指针?A:因为通过使用双指针可以使算法的时间复杂度降低(或者降低遍历次数),有时也能降低空间复杂度
分类根据双指针的用法,可分为前后双指针,头尾双指针,快慢双指针…..
以下为各种双指针的应用及介绍前后双指针应用一 删除排序数组中的重复项要求:原地删除,并返回新数组的长度,不需要考虑数组中超出新长度后面的元素。
思路:通过创建一前一后两个指针,前指针指向上一个元素,后指针向后历遍,一旦找到不同的元素,前指针指向下一个位置,并视为空位,通过后指针找到目标元素,并存入前指针目前所指向的空位。然后后指针接着遍历,直至遍历整个数组.
12345678910111213141516171819202122//代码实现int removeDuplicates(int* nums, int numsSize){ int* left = nums; int*right = nums+1; int ret = 1; //遍历数组 for (int i ...
=算法=按位异或^的种种玩法
什么是按位异或^首先将不同数制的数写成二进制,例如9->0b1001.然后最末位对齐,依次按位异或.规则:0 ^ 0= 0 ; 1 ^ 1 = 0; 1 ^ 0 = 1推论:任意整数x,都有0^x = x ; x ^ x = 0\
来看看应用
寻找一个单身狗数像[1,3,2,2,3]这样除了某一个数1,剩下的数字都是成对的,也就是说遍历一次数组,把所有的元素按位异或在一起,结果便是落单的那个1
12345678910//代码实现int arr[] = {1,3,2,2,3};int sz = sizeof(arr)/sizeof(arr[0]);//求数组大小int ret = 0;for (int i =0;i<sz;i++){ ret^=arr[i];}return ret; //此时ret即为落单的那个数
变形
消失的数已知一个由0~n(缺失一个数)填充的数组,例[0,6,4,2,3,1],例中的数组少了一个5,而我们已知数组包含0~6中的5个数,就可以将数组元素与0~6按位异或到一起,将问题消失的数转化为问题寻 ...