算法笔记记录篇章一 语言篇

178 阅读4分钟

一.基础语法

(一)常用语法

1.memset:对数组中每一个元素赋相同值

用法:
(1)头文件:#include<string.h>
(2)赋值0:memset(a,0,sizeof(a))
  赋值-1:memset(a,-1,sizeof(a))
(3)注意点:memset初学者只建议赋值0,-1 (4)对数组赋值其他数字:fill函数

2.字符数组的输入输出

用法:
(1)字符数组输入输出:
  ①单个字符输入,能够识别空格与回车:%c

  for(int i = 0; i < str.length;i++) {
    printf("%c",str[i]);     
  }  

  ②输入一个字符串,不能识别空格与换行:%s

        char str[10];  
        scanf("%s",str);
        printf("%s",str);

  ③getchar输入,putchar输出:仅限单个字符
  1)getchar:可识别换行符空格

// 普通字符输入
char c1 = getchar();
// 二维数组输入
char str[10][10];
for(int i = 0; i < 10; i++) {
    for(int j = 0; j < 10; j++) {
        str[i][j] = getchar();
    }
}

  2)putchar:可识别换行符空格

// 普通字符输入
putchar(c1);
// 二维数组输入
char str[10][10];
for(int i = 0; i < 10; i++) {
    for(int j = 0; j < 10; j++) {
        putchar(str[i][j]);
    }
    putchar("\n");
}

  ④gets输入,puts输出
   1)gets输入一行字符串,识别\n结束

// 一维数组
char str1[20];
gets(str1);
puts(str1);
// 二维数组
char str2[20][20];
for(int i = 0; i < 3; i++) {
    gets(str2[i]);
}
for(int i = 0; i < 3; i++) {
   puts(str2[i]);
}

3.sscanf+sprintf(在stdio.h头文件下)

(1)sscanf:string+scanf
// 把str中内容以"%d"格式传输到n中(从左至右)
char str[100];
sscanf(str,"%d",&n);
printf("%d",n);
(2)sprintf:string+printf
// 把n以"%d"格式传输到str中(从右至左)
char str[100];
sprintf(str,"%d",n);
printf("%s",str);

(二)常用方法

1.冒泡排序

int temp = a;
a = b;
b = temp;

(三)常用函数

1.以数组作为函数参数

(1)参数中一维数组不需要填参数,二维数组第一位不需要填参数

2.指针与数组

(1)交换函数
void swap(int* a,int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}
int main() {
    int a = 1,b = 2;
    int *p1 = &a,*p2 = &b;
    swap(p1,p2);
    printf("%d%d",*p1,*p2);
}

3.引用

(1)交换函数
void swap(int* &a,int* &b) {
    int* temp = a;
    a = b;
    b = temp;
}
int main() {
    int a = 1,b = 2;
    int *p1 = &a,*p2 = &b;
    swap(p1,p2);
    printf("%d%d",*p1,*p2);

4.结构体

(1)应用场景
①将若干个不同的数据类型的变量或数组封装在一起,存储自定义结构
(2)定义
①例子:

②注意点:

(3)访问方法
// 定义
struct stuInfo {
    int id;
    char name[20];
    stuInfo* next;
}stu,*p;
// 访问方法
// 访问stu中变量写法
stu.id
stu.name
stu.next
// 访问*p中元素写法一
(*p).id
(*p).name
(*p).next
// 访问*p中元素写法二
p->id
p->name
p->next
(4)结构体初始化
①构造函数:不需写返回类型,且函数名与结构体名相同

(四)补充内容

(1)浮点数比较
①等于运算符

1)定义eps=1e-8 定义方式 :

const double eps = 1e-8
#define Equ(a,b) ((fabs(a)-(b)))<(eps))

2)案例:

②大于/小于运算符

1)定义:

// 大于运算符
const double eps = 1e-8
#define More(a,b) ((a)-(b))>(eps))
// 大于等于运算符
const double eps = 1e-8
#define MoreEqu(a,b) ((a)-(b)>(-eps))
//小于运算符
const double eps = 1e-8
#define Less((a,b) ((a)-(b)<(-eps))
// 小于等于运算符
const double eps = 1e-8
#define Less((a,b) ((a)-(b)<(eps))
③圆周率
const double Pi=acos(-1.0);
(2)复杂度
①时间复杂度

O(1) < O(logn) < O(n) < O(n^2)

②空间复杂度
(3)黑盒测试
①定义:

②单点测试

③多点测试
(1)区别:相较单点测试,必须结果全部正确。
(2)三种输入方式
①while...EOF
1)使用情况:当题目没有说明有多少数据需要读入时。利用scanf返回值是否为EOF判断是否结束
while (scanf("%d,&n") != EOF) {
    ...
}

控制台内手动输入Ctrl+z后在Enter后结束while循环

②while...break
1)使用情况:当输入的n个数据数据为n个0表示输入结束
(a)while...EOF内部判断+while...break

(b)退出条件判断放到while循环中
int a,b;
while(scanf("%d%d",&a,&b), a || b) {
    printf("%d\n",a+b);
}
③while(T--)
1)使用情况:题目给出测试数据组数,再给出相应数量组数输入数据,用变量T存储组数
int T,a,b;
scanf("%d",&T);
while(T--) {
    scanf("%d%d",&a,&b);
    printf("%d\n",a+b);
}
(3)三种常见输出类型