自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(76)
  • 收藏
  • 关注

原创 cosnt修饰指针辨析

const在 * 之前,cons修饰的是指针指向的对象;const在 * 之后,cons修饰的是指针本身。

2022-01-19 19:40:52 800 2

原创 3 栈和队列

1、栈1.1栈的概念及结构栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶。1.2栈的实现栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。stack.h//LIFO 后进先出#pr

2022-01-17 21:39:36 271 9

原创 scanf设置精度、域宽易错点

在printf时,可以设置输出的精度和域宽(%m.pX或%-m.pX格式 - 这里m、p都是整数,X是字母,p若要省去,m与p之间的.也要省去);但是scanf是不能设置精度的,但是可以设置输入的域宽,即不可以有%.pX类形式,但是可以有%mX类形式。此类问题一般不会报错,但是输出结果会有问题!...

2021-12-07 13:53:08 2562 10

原创 2 顺序表和链表

万字详解顺序表和链表

2021-11-29 00:01:09 864 24

原创 1 一篇搞懂时间复杂度和空间复杂度

算法的复杂度算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。在计算机发展的早期,计算机的存储容量很小,所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。时间复杂度时间复杂度的定义在计算机科学中,算法的时间

2021-10-18 00:06:20 340 24

原创 隔壁大妈看了直呼“so easy!”之C语言递归解决青蛙跳台阶问题

题目一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶(不可后退)。求该青蛙跳上一个n级的台阶总共有多少种跳法?思路青蛙一次只可以跳1级台阶或者2级台阶,那么跳n级台阶的最后一步,必定是选择跳1级台阶或者跳2级台阶。若青蛙选择最后一步跳1级台阶,则其前n-1级台阶的跳法种数等于跳n-1级台阶时的跳法总种数;若青蛙选择最后一步跳2级台阶,则其前n-2级台阶的跳法种数等于跳n-2级台阶时的跳法总种数。令f(n)表示跳n级台阶的总种数,则f(n)=f(n-1)+f(n-2),n>

2021-10-02 14:46:29 232 6

原创 C语言递归解决汉诺塔问题

汉诺塔问题介绍首先,什么是汉诺塔问题呢?相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。——来自百度百科要将n个金盘按要求从A杆移动到C杆,应该如何操作?思路1.借助C杆,将n.

2021-10-02 02:26:57 241 2

原创 C语言进阶笔记(十一) | 文件操作(详解)

什么是文件磁盘上的文件是文件。在程序设计中,我们一般谈的文件有两种:程序文件、数据文件程序文件包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。数据文件文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。我们这里讨论的是数据文件。在以前所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。 其实有时候我们会把

2021-09-26 20:27:14 551 17

原创 C语言进阶笔记(十) | 动态内存管理

为什么存在动态内存分配我们已经掌握了部分内存开辟的方式,比如:int a = 10;float f = 1.1;int arr[10] = { 0 };//等等但是,这些开辟内存空间的方式有两个特点:1. 空间开辟大小是固定的。2. 数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配。然而对于空间的需求,有时候我们需要的空间大小在程序运行的时候才能知道,那上述开辟空间的方式就不能满足了,这时候就需要动态存开辟了。动态内存函数绍malloc和free

2021-09-24 21:48:41 542 11

原创 C语言进阶笔记(九) | 自定义类型3 联合体(共用体)

目录联合体类型的定义联合的特点应用举例联合大小的计算联合体类型的定义联合体类型也是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间(所以联合体也叫共用体)。#include<stdio.h>联合体类型的声明union Un{ char c; int i;};int main(){ //联合体变量的定义 union Un u; printf("%p\n", &u);//00D5F88C

2021-09-14 21:16:48 322 13

原创 C语言进阶笔记(八) | 自定义类型2 枚举

枚举顾名思义就是一一列举,把可能的取值(有限的)一一列举。枚举类型的定义枚举{ }中的内容是枚举类型的可能取值 - 枚举常量 结构体{ }中的内容是其结构体成员,注意二者不同。enum Day//星期{ //枚举常量 用,隔开 Mon, Tues, Wed, Thur, Fri, Sat, Sun};enum Sex//性别{ MALE, FEMALE, SECRET};这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋..

2021-09-14 20:11:58 199 2

原创 C语言进阶笔记(七) | 自定义类型1 结构体(详解)

目录结构体的声明结构体声明及使用特殊的声明结构体的自引用错误的自引用正确的自引用结构体变量的定义和初始化结构体内存对齐计算结构体的大小结构体的对齐规则存在内存对齐的原因修改默认对齐数结构体传参已经知道数组是相同类型元素的集合,而结构体也是一些值的集合,结构的每个成员可以是不同类型。结构体的声明例如:描述一本书struct Book//struct - 结构关键词 Book - 结构体标签名 struct Book - 结构体类型...

2021-09-13 20:49:47 815 6

原创 什么?用memcmp比较浮点数竟然比出了1.0大于2.0!莫慌,来看详解

memcmp是一个库函数,用来比较两个内存块的前num个字节;该函数在头文件<string.h>中,函数定义为:int memcmp (const void *s1, const void *s2, size_t n);代码演示#include<stdio.h>#include<string.h>int main(){ float arr1[] = { 1.0,2.0,3.0,4.0,5.0 }; float arr2[] = { 1.0,1..

2021-09-10 19:51:53 504 3

原创 C语言进阶笔记(六) | 详解内存函数及其模拟

目录memcpy函数介绍代码演示模拟memcpymemmove函数介绍代码演示模拟memmovememcmp函数介绍代码演示memcpy函数介绍void * memcpy ( void * destination, const void * source, size_t num );将num个字节的值从源指向的位置直接复制到目标指向的内存块。源指针和目标指针指向的对象的基本类型与此函数无关;这个函数在遇到 '\0' 的时候并不会停下来,总

2021-09-10 19:42:10 552 1

原创 C语言进阶笔记(五) | 字符函数

目录字符分类函数isdigit演示isupper演示字符转换函数代码演示字符分类函数判断其参数是否为右侧字符,若是,则返回真(非0数);若不是,则返回假(0)。iscntrl - 任何控制字符isspace - 空白字符:空格‘ ’,换页‘\f’,换行'\n',回车‘\r’,制表符'\t'或者垂直制表符'\v'isdigit - 十进制数字 0~9isxdigit - 十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A~Fislower - 小写字

2021-09-10 13:06:23 336 4

原创 C语言进阶笔记(四) | 万字详解字符串函数及其模拟

前言C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在 常量字符串中或者字符数组中。 字符串常量适用于那些对它不做修改的字符串函数。函数介绍strlensize_t strlen ( const char * str );1.字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。2.参数指向的字符串必须要以 '\0' 结束。3.注意函数的返回值为size_t,是无符号的( .

2021-09-09 19:14:17 888 23

原创 将数组A中的内容和数组B中的内容进行交换。(数组一样大)

描述将两个大小一样(假设包含3个元素)的数组内容交换。输入描述一个数组输入一行输出描述一个数组输出一行示例输入:4 5 6 1 2 3输出:1 2 3 4 5 6代码#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>int main(){ int A[3] = { 0 }; int B[3] = { 0 }; int i = 0;...

2021-09-06 18:02:54 129 3

原创 实现一个对整型数组的冒泡排序

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。——上文来自百度百科代码#include<stdi..

2021-09-06 16:48:26 1203

原创 从键盘任意输入一个字符,编程判断是否是字母(详解)

输入描述:多组输入,每行输入包括一个字符。输出描述:针对每行输入,输出该字符是字母(YES)或不是(NO)。代码#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>int main(){ char ch=0; while(scanf("%c",&ch)!=EOF)//循环输入多组数据 使用Ctrl+z结束循环 { getchar();//清楚缓存区因回车键所致的'

2021-09-04 19:56:50 5485 1

原创 递归和非递归分别实现求第n个斐波那契数

首先,需要先了解什么是斐波那契数列?斐波那契数列:数学上以递推的方法定义:F(0) = 0,F(1) = 1, F(n) = F(n - 1) + F(n - 2)(n ≥ 2,n ∈ N * )0、1、1、2、3、5、8、13、21、34、……递归写法#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>int F(int n){ if (n == 0) { return 0; } else if (n =

2021-09-03 20:31:50 168

原创 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和

例如,调用DigitSum(123),则应该返回1+2+3,它的和是6输入:123,输出:6#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>int DigitSum(int n){ if (n > 9) return DigitSum(n / 10) + n % 10; else return n;}int main(){ int n = 0; scanf("%d", &n); int r

2021-09-03 15:33:37 444 1

原创 递归实现字符串逆序

编写一个函数 reverse_string(char * string)(递归实现)实现:将参数字符串中的字符反向排列,不是逆序打印。#include<stdio.h>//循环//void reverse_string(char* arr)//{// char* left = arr;// char* right = arr + strlen(arr) - 1;// while (left < right)// {// char tmp = *left;//

2021-09-02 21:55:32 354 5

原创 递归和非递归分别实现strlen

循环写法#include<stdio.h>//传值写法int my_strlen(char ch[]){ int i = 0; int count = 0; while (ch[i]) { count++; i++; } return count;}//传址写法int my_strlen(char* str){ int count = 0; while(*str) { count++; str++; } return c

2021-09-02 20:08:31 149

原创 递归和非递归分别实现求n的阶乘(不考虑溢出的问题)

循环写法#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>int Fac(int n){ int ret = 1; while(n) { ret = ret * n; n--; } return ret;}int main(){ int n = 0; scanf("%d", &n); int ret = Fac(n); printf("%d\n", ret); return 0;}递归

2021-09-02 20:03:17 746

原创 写一个函数,递归方式实现打印一个正整数的每一位

#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>void print(int n){ if (n > 9) { print(n / 10); } printf("%d ", n % 10);}int main(){ int n = 0; scanf("%d", &n); print(n); return 0;}

2021-09-02 16:03:51 228

原创 八道指针笔试题集合,练会让你不再害怕“晕针”

下面代码打印结果是什么?笔试题1#include<stdio.h>int main(){ int a[5] = { 1, 2, 3, 4, 5 }; int* ptr = (int*)(&a + 1); printf("%d,%d", *(a + 1), *(ptr - 1)); return 0;}解析代码#include<stdio.h>int main(){ int a[5] = { 1, ..

2021-09-02 15:46:19 447 5

原创 指针和数组笔试题 来一场酣畅淋漓的分析计算

求下面代码输出结果#include<stdio.h>#include<string.h>int main(){ //1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。 //2.& 数组名,这里的数组名表示整个数组,取出的是整个数组的地址。 //3.除此之外所有的数组名都表示首元素的地址。 // //一维数组 //int a[] = { 1,2,3,4 }; //printf("%d\n", sizeof(a));//1

2021-09-01 16:20:56 135 2

原创 使用回调函数,模拟实现qsort(采用冒泡的方式)

冒泡排序算法的原理1.比较相邻的元素,如果第一个比第二个大,就交换他们两个。2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。3.针对所有的元素重复以上的步骤,除了最后一个。4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。代码演示冒泡排序 - 只能排序整型数组#include<stdio.h>void BubbleSort(int arr[], int sz){ in...

2021-08-30 21:20:31 242 1

原创 C语言进阶笔记(三) | 指针详解(下)

目录函数指针看一段代码再举个栗子函数指针数组举个栗子函数指针数组的用途:转移表函数指针数组指针回调函数回调函数的使用qsort函数使用回调函数,模拟实现qsort函数指针数组指针是指向数组的指针;那么函数指针不难理解,是指向函数的指针,存放函数地址的指针。看一段代码#include <stdio.h>void test(){ printf("hehe\n");}int main(){ printf.

2021-08-30 21:06:27 435

原创 二分查找 | 编写代码在一个整形有序数组中查找具体的某个数

思路:1. 找到数组的中间位置2. 检测中间位置的数据是否与要查找的数据k相等 a: 相等,找到,打印下标,跳出循环 b: k< arr[mid],则key可能在arr[mid]的左半侧,继续到左半侧进行二分查找 c: k> arr[mid],则key可能在arr[mid]的右半侧,继续到右半侧进行二分查找3. 如果找到了,返回下标,否则继续;直到区间中没有元素时,说明数组中没有k,打印“没找到”易错点:...

2021-08-29 18:28:51 295 2

原创 用C语言计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值

思路:1.可以看出,该表达式主要由100项,奇数项为正,偶数项为负;2.可以设置一个循环从1~100,给出表达式中的每一项:1.0/i(因为是分数,所以需要用到浮点型)3.对于控制每项的正负,正常想法是用(-1)^n,但是需要注意的是在程序里^表示异或,并不能用来求一个数的幂值(有对应的幂函数pow,这里不多做讲述),但是我们可以再创建一个变量赋值为1来控制每项的正负。看代码:#include<stdio.h>int main(){ int i = 0; doub

2021-08-28 19:57:49 2659 4

原创 用C语言打印100~200之间的素数(详解)

素数:即质数,除了1和自己之外,再没有其他的约数,则该数据为素数。方法一:试除#include<stdio.h>int main(){ int i = 0; for(i=100; i<=200; i++) { //判断i是否为素数:用[2, i)之间的每个数据去被i除,只要有一个可以被整除,则不是素数 int j = 0; for(j=2; j<i; j++) { if(i%j == 0) { break; } }

2021-08-28 15:28:43 3402 3

原创 用C语言求两数的最大公约数

最大公约数,即两个数据中公共约数的最大者。求解的方式有很多,暴力穷举、辗转相除法、更相减损法、Stein算法算法。此处主要介绍:辗转相除法辗转相除法:对于两个整数,用一个数除以另一个数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。得到最后的除数就是这两个数的最大公约数。其计算原理依赖于下面的定理:两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。代码:#define _CRT_SE..

2021-08-28 15:04:14 515

原创 用C语言打印1000年到2000年之间的闰年

首先闰年的置闰规则:普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年。世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年。知道了闰年的判断规则就可以写代码了:#include <stdio.h>int main(){ int year = 0; for(year=1000; year<=2000; year++) { //判断year是否为闰年 if(year%4==0) //如果year能够被4整除,year可能为闰年 .

2021-08-28 14:54:58 451

原创 C语言进阶笔记(二) | 指针详解(上)

目录字符指针指针数组数组指针数组指针的定义&数组名VS数组名数组指针的使用数组参数、指针参数一维数组传参二维数组传参一级指针传参二级指针传参通过前面的学习,我们知道了指针的概念:1. 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。2. 指针的大小是固定的4/8个字节(32位平台/64位平台)。3. 指针是有类型,指针的类型决定了指针的+-整数的步长,指针解引用操作的时候的权限。4. 指针的运算。这里,我们将继续学...

2021-08-27 21:07:30 1105 6

原创 数组数组 指针指针 数组指针 指针数值 详解二者结合体int(*parr[6])[6]

目录数组指针指针数组int arr[6]int* p=&aint *parr1[6]int (*parr2)[6]int(*parr3[6])[6]首先数组、指针,单个看我们都明白,就不介绍了。数组指针即指向数组的指针。指针数组即元素为指针的数组。int arr[6]很简单,arr是一个数组,有6个元素,元素类型是int;即arr是一个含有6个整型元素的数组。int* p=&a也很简单,*表示p是一个指针,指向

2021-08-25 22:31:43 271 1

原创 C语言进阶笔记(一) | 深度剖析数据在内存中的存储

目录数据类型的基本归类类型的意义整型家族浮点数家族构造类型指针类型空类型整形在内存中的存储原码、反码和补码大小端介绍练习题练习1练习2练习3练习4浮点型在内存中的存储浮点数表示形式IEEE 754规定有效数字M的保存指数E的保存指数E从内存中取出练习题数据类型的基本归类类型的意义1. 使用这个类型开辟内存空间的大小(大小决定了使用范围)。2. 如何看待内存空间的视角。整型家族cha...

2021-08-24 20:03:47 602 3

原创 模拟库函数strcpy之改善改善再改善再再改善

首先,普通写法#include<stdio.h>void my_strcpy(char* dest, char* src){ while (*src != '\0') { *dest = *src; dest++; src++; } *dest = *src;}int main(){ char arr1[] = "#############"; char arr2[] = "hello"; //strcpy(arr1, arr2);//后者内容.

2021-08-23 21:17:11 161

原创 关于const使用的一些辨析

const修饰指针变量的时候:1. const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改 变。但是指针变量本身的内容可变。 2. const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指 针指向的内容,可以通过指针改变。代码演示代码1 const无效使用#include<stdio.h>int main(){ const int num = 10; int* p = &num;...

2021-08-23 20:52:36 155

原创 C语言学习笔记(九) | 实用调试技巧

目录调试的基本步骤Debug和Release的介绍常用的几个调试快捷键调试的时候查看程序当前信息如何写出好(易于调试)的代码优秀的代码常见的coding技巧编程常见的错误首先,调试是什么?调试(英语:Debugging / Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。调试的基本步骤发现程序错误的存在以隔离、消除等方式对错误进行定位确定错误产生的原因提出纠正错误的解决办法对程序错误予以改正,重新测试.

2021-08-23 20:48:21 220

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除