初阶第一节-初识C语言

1.数据类型

1.1数据类型的分类

char        //字符数据类型

short       //短整型

int         //整形

long        //长整型

long long   //更长的整形

float       //单精度浮点数

double      //双精度浮点数

字符类型:
    char ch = 'a';
整型:
    int age = 20;
短整型:
    short num = 10;

长/更长整型:
    //long 
    //long long

单精度浮点型:
    float weight = 55.5;

双精度浮点型:
    double d = 0.0;

printf("%d\n", sizeof(char));//1
printf("%d\n", sizeof(short));//2
printf("%d\n", sizeof(int));//4
printf("%d\n", sizeof(long));//4/8
printf("%d\n", sizeof(long long));//8
printf("%d\n", sizeof(float));//4
printf("%d\n", sizeof(double));//8

C语言规定:sizeof(long)>= sizeof(int)
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

%zusizeof()用sizeof来求字符的大小

1.2计算机中的单位

bit8byte
byte1024kb
kb1024mb
mb1024gb
gb1024tb
tb1024pb


2.变量,常量

 2.1变量和常量

变量和常量概念:生活中的有些值是不变的(比如:圆周率,性别,身份证号码,血型等等);有些值是可变的(比如:年龄,体重,薪资)。不变的值,C语言中用常量的概念来表示,变得值C语言中用变量来表示。

//变量分为:
//局部变量 - {}内部定义的变量
//全局变量 - {}外部定义的变量
#include<stdio.h>
int b = 20;//全局变量
int main()
{
	//创建的一个变量的方法:
	//类型    变量的名字 = 0;//推荐
	//类型  变量的名字;//不推荐
	short age = 20;//年龄
	int high = 180;//身高
	double weight = 75.3;//体重
    float score = 80.5f;//不加f的话,编译器会默认80.5为double类型

	int a = 10;//局部变量
	return 0;
}
#include<stdio.h>
int a = 100;//全局变量
int main()
{
	//局部变量 - {}内部定义的
	//当局部变量和全局变量名字冲突的情况下,局部优先
	//不建议:把全局变量和局部变量的名字写成一样的
	int a = 10;//局部变量
	printf("%d\n", a);//10
	return 0;
}

2.2变量的使用 

//写一个代码求2个整数的和
//scanf函数是输入函数
//printf函数是输出函数
#include<stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	int sum = 0;
	scanf("%d %d", &a, &b);
	sum = a + b;
	printf("sum = %d\n", sum);
	return 0;
}

2.3变量的作用域和生命周期

2.3.1作用域

作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用 的 而限定这个名字的可用性的代码范围就是这个名字的作用域。                                                   1. 局部变量的作用域是变量所在的局部范围。 2. 全局变量的作用域是整个工程。

// 作用域
//局部变量的作用域:就是变量所在的局部范围
//全局变量的作用域:整个工程

//局部变量
#include<stdio.h>
int main()
{
	{
		int a = 10;
		printf("a = %d\n", a);//10
	}
	printf("a = %d\n", a);//err
	return 0;
}

int main()
{

	int a = 10;
	{
		printf("a = %d\n", a);//10
	}
	printf("a = %d\n", a);//10
	return 0;
}
//全局变量
#include<stdio.h>
int g_val = 2021;//全局变量
int main()
{
	printf("1:%d\n", g_val);//1:2021
	{
		printf("2:%d\n", g_val);2:2021
	}
	printf("3:%d\n", g_val);//3:2021
	return 0;
}

2.3.2生命周期

生命周期
变量的生命周期:变量的创建和销毁之间的时间段
局部变量的生命周期:进入局部范围生命开始,出局部范围生命结束
全局变量的生命周期:程序的生命周期

2.4常量 

C语言中的常量和变量的定义的形式有所差异。 C语言中的常量分为以下以下几种: 字面常量;const 修饰的常变量;#define 定义的标识符常量;枚举常量。

#include<stdio.h>
#define MAX 10000   
int main()
{
	//1. 字面常量
	//3.14;
	//10;
	//'a';
	//"abcdef";

	//2. const修饰的常变量
	const int num = 10;//在C语言中,const修饰的num就是常变量 - 本质是变量,具有常属性(不能被改变的属性)
	num = 20;//err
	printf("num = %d\n", num);//无const为20,有const为10

	//解释常变量:
	int arr[10] = { 0 };//10个元素
	const int n = 10;
	int arr[n] = { 0 };//err - arr[]里面要放的是常量,n是变量

    //3. #define 定义的标识符常量
	//MAX = 2000//err
	int n = MAX;
	printf("%d\n", n);//1000
	return 0;
}

//4. 枚举常量
#include<stdio.h>
enum Sex//性别
{
	//这种枚举类型的变量的未来可能取值
	//枚举常量
	MALE = 3,//赋初值,不赋初值的话默认为0
	FEMALE,//4
	SECRET//5
};
int main()
{
	//可以一一列举的常量   
	MALE = 3;//err
	printf("%d\n", MALE);//3
	printf("%d\n", FEMALE);//4
	printf("%d\n", SECRET);//5
	return 0;
}

3.字符串+转义字符+注释

3.1字符串

"hello bit.\n" 这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。 注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。 

#include<stdio.h>
#include <string.h>
int main()
{
	//100 - int 
	// char字符类型,'a'
	// char ch = 'a'
	// 字符串,"abcdef"
	// C语言中没有字符串类型
	//字符数组 - 数组是一组形同类型的元素
	//字符串在结尾的位置隐藏了一个\0的字符
	//\0是字符串的结束标志

	char arr1[] = "abc";//abc\0
	char arr2[] = { 'a', 'b', 'c' };//abc
	char ch[5] = { 'a', 'b', 'c' };//不完全初始化,剩余的默认为0

	//打印字符串
	printf("%s\n", arr1);//abc
	printf("%s\n", arr2);//乱码

	//求一下字符串的长度
	printf("%d\n", strlen(arr1));//3
	printf("%d\n", strlen(arr2));//随机值
	int len = strlen("abc");//string length
	printf("%d\n", len);//3

	//求一下字符串的大小(单位:字节)
	printf("%d\n", sizeof(arr1));//4
	printf("%d\n", sizeof(arr2));//3
	printf("%d\n", sizeof(ch));//5
	return 0;
}

 3.2转义字符

转义字符释义
\?在书写连续多个问号时使用,防止他们被解析成三字母词
\'用于表示字符常量 '
\"用于表示一个字符串内部的双引号 "
\\用于表示一个反斜杠,防止它被解释为一个转义序列符
\n换行
\r回车
\t水平制表符
\dddddd表示1~3个八进制的数字。 如: \130 X
\xdddd表示2个十六进制数字。 如: \x30 0
\a警告字符,蜂鸣
\b退格符
\f进纸符
\v垂直制表符
#include<stdio.h>
#include<string.h>
int main()
{
	//\?的使用
	printf("(are you ok??)");//??) -- ] - 三字母词
	//有些编译器会打出(are you ok]
	printf("(are you ok\?\?)");//(are you ok??)

	printf("%c\n", '\'');//'
	printf("%s\n", "abc");//abc
	printf("%s\n", "a");//a
	printf("%s\n", "\"");//"
	printf("%s\n", "'");//'
	printf("c:\\test\\test.c");//c:\\test\\test.c

	printf("%c\n", '\130');//X - 8进制的130是十进制88,X -- ASCII码值是88
	printf("%c\n", '\101');//A - 8进制的101是十进制65,A -- ASCII码值是65
	printf("%c\n", '\x63');//c - 16进制的63是十进制99,c -- ASCII码值是99 

	printf("%d\n", strlen("abc"));//3
	printf("%d\n", strlen("c:\test\328\test.c"));//14 - 8进制的取值范围是0~7
	return 0;
}

3.3注释

注释有两种风格: 1.C语言风格的注释 /*xxxxxx*/ ,缺陷:不能嵌套注释(即出现/*后遇到*/就完成了注释。2.C++风格的注释 //xxxxxxxx ,可以注释一行也可以注释多行 。

4.选择语句与循环语句

4.1选择语句

#include<stdio.h>
int main()
{
	int input = 0;//输入的值
	printf("加入比特:>\n");
	printf("那要好好学习吗(1/0)?>:");
	scanf("%d", &input);
	if (input == 1)
	{
		printf("好offer\n");
	}
	else
	{
		printf("卖红薯\n");
	}
	return 0;
}

4.2循环语句

#include<stdio.h>
//比特 - 30000代码 - 找一个不错的工作
int main()
{
	int line = 0;
	//循环
	while (line < 30000)
	{
		printf("写代码:%d\n", line);
		line++;
	}
	if (line == 30000)
	{
		printf("好offer\n");
	}
	return 0;
}

5.函数与数组

5.1函数

#include<stdio.h>
int Add(int x, int y) //int是返回类型;Add是函数名;int x和int y是函数参数
{
	int z = 0;
	z = x + y;
	return z;//return x+y;
}
int main()
{
	int num1 = 0;
	int num2 = 0;
	scanf("%d%d", &num1, &num2);
	int sum = Add(num1, num2);//函数的方式解决
	printf("%d\n", sum);
	return 0;
}

5.2数组

5.21数组的定义和下标

int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个整形数组,最多放10个元素,下标的范围是0-9

          下标:0,1,2,3,4,5,6,7,8,9

char ch[5] = {0};
double d[30] = {0};

5.22数组的使用

#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int i = 0;
	while (i < 10)
	{
		printf("%d ", arr[i]);//1 2 3 4 5 6 7 8 9 10
		i++;
	}
	return 0;
}

6.操作符

6.1操作符的分类 

//算数操作符/和%
int a1 = 9 / 2;
float a2 = 9 / 2.0;//等价于9.0 / 2.0和9.0 / 2
int a3 = 9 % 2;//% - 取模(余)
//取模操作符的两个操作符只能是整数
printf("%d\n", a1);//4
printf("%f\n", a2);//4.500000
printf("%.1f\n", a2);//4.5
printf("%d\n", a3);//1


//赋值操作符   
int a = 2;

a = a + 5;//7
a += 5;

a = a - 3;//-1
a -= 3;

a = a % 3;//2
a %= 3;
    ......

//单目操作符(只有一个操作数的操作符) !
#include<stdio.h>
int main()
{
    //0 表示假,非0就是真
    int a = 0;
    printf("%d\n", !a);//1

    if (a)
    {
        //如果a为真,做事
    }
    if (!a)
    {
        //如果a为假,做事
    }
    return 0;

}



//正负值
int a = -5;
int a = -a;//5
int a = +a;//-5


//sizeof
//是一个操作符
//不是函数
//计算类型或者变量的大小的

int a = 10;
printf("%d\n", sizeof(int));//4 
printf("%d\n", sizeof(a));//4

int arr1[10] = { 0 };
printf("%d\n", sizeof(arr));//10*4=40 - 计算的是数组的总大小,单位是字节
printf("%d\n", sizeof(arr[0]));//4

printf("%d\n", sizeof arr[0]);//4
int sz = sizeof(arr) / sizeof(arr[0]);
printf("%d\n", sz);//10 - 数组的元素个数

char arr2[] = "welcome to bit!!!!";
int sz = sizeof(arr2) / sizeof(arr2[0]);
printf("%d\n", sz);//19 - 计算的时候包含了\0

char arr3[] = { 'a', 'b', 'c' };//abc
printf("%d\n", sizeof(arr3));//3

char ch[5] = { 'a', 'b', 'c' };//不完全初始化,剩余的默认为0
printf("%d\n", sizeof(ch));//5


//前置、后置++
int a = 10;
int b = a++;//后置++,先使用,再++
//b=a;a=a+1;

printf("%d\n", b);//10
printf("%d\n", a);//11

int b = ++a;//前置++ - 先++,后使用
//b=a+1;a=a+1;

printf("%d\n", b);//11
printf("%d\n", a);//11


//前置、后置--
int a = 10;
int b = a--;//后置--,先使用,再--
//b=a;a=a-1;

printf("%d\n", b);//10
printf("%d\n", a);//9


int b = --a;//前置-- - 先--,后使用
//b=a-1;a=a-1;

printf("%d\n", b);//9
printf("%d\n", a);//9



//强制类型转换
int a = 3.14;
int a = (int)3.14;
printf("%d\n", a);//3
//3.14 字面浮点数,编译器默认理解为double类型

//==
#include<stdio.h>
int main()
{
    int a = 10;
    if(a = 3)//为真,打印hehe;若(a == 3),则不打印hehe
    {
        printf("hehe");
    }
    return 0;
}

  

// &&和 ||
#include<stdio.h>
int main()
{
    int a = 2;
    int b = 3;
    if (a && b)
    {
        printf("hehe");//a和b都为真时才会打印
    }
    int a = 2;
    int b = 3;
    if (a || b)
    {
        printf("hehe");//a和b至少有一个为真时才会打印
    }
    return 0;
}

//exp1 ? exp2 : exp3
//若exp1为真,则输出 exp2
//若exp1为假,则输出 exp3
#include<stdio.h>
int main()
{
    int a = 0;
    int b = 3;
    int max = 0;

    //if (a > b)
    //    max = a;
    //else
    //    max = b;

    max = a > b ? a : b;
    printf("%d\n", max);
    return 0;
}

#include<stdio.h>
int main()
{
    int a = 0;
    int b = 3;
    int c = 5;
            //a=5       c=1        b=3
    int d = (a = b + 2, c = a - 4, b = c + 2);
    //逗号表达式,是从左向右依次计算的
    //整个表达式的结果是最后一个表达式的结果

    printf("%d\n", d);//3
    return 0;
}

  

//下标引用操作符[]
#include<stdio.h>
int main()
{
    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    int n = 3;
    arr[n] = 20;//[]就是下标引用操作符,arr和3就是[]的操作数
    printf("%d\n", arr[n]);
    return 0;
}


//函数调用操作符()
#include<stdio.h>
int Add(int x, int y)
{
    return x + y;
}
int main()
{
    int sum = Add(2, 3);//()就是函数调用操作符,Add,2,3都是()的操作数
    return 0;
}

7.常见关键字 

7.1关键字typedef 

//typedef 顾名思义是类型定义,这里应该理解为类型重命名
#include<stdio.h>
typedef struct Node //将struct Node重命名为Node, 所以Node也是一个类型名
{
    int data;
    struct Node* next;
}Node;



typedef unsigned int u_int;//将unsigned int重命名为uint_32, 所以uint_32也是一个类型名
int main()
{
    unsigned int num = 100;
    u_int num2 = 100;

    struct Node n1;
    Node n2;
    return 0;
}

7.2关键字static 

在C语言中: static是用来修饰变量和函数的                                                                                   1.修饰局部变量-称为静态局部变量;2.修饰全局变量-称为静态全局变量;3.修饰函数-称为静态函数 

//修饰局部变量
//static修饰局部变量的时候,局部变量出了作用域,不销毁的。本质上,static修饰局部变量的时候,改变了变量的存储位置(由栈区变为静态区)。影响了变量的生命周期,生命周期变长,和程序的生命周期一样。

#include<stdio.h>
void test()
{
    static int a = 1;
    a++;
    printf("%d ", a);//不加static 2 2 2 2 2 2 2 2 2 2
                     //加static   2 3 4 5 6 7 8 9 10 11
}
int main()
{
    int i = 0;
    while (i<10)
    {
        test();
        i++;
    }
    return 0;
}  

8.#define定义常量和宏 

//define 是一个预处理指令
//1.define定义符号

#include<stdio.h>
#define MAX 1000
int main()
{
    printf("%d\n", MAX);//1000
    int n = MAX;
    printf("%d\n", n);//1000
    int arr[MAX] = { 0 };
    return 0;
}



//2. define 定义宏
#define ADD(X,Y) ((X)+(Y))
//ADD是宏名;X和Y是宏的参数,参数是无类型的;((X)+(Y))是宏体

#include<stdio.h>
int main()
{
    printf("%d\n", 4*ADD(2, 3));//20
    return 0;
}

9.指针 

9.1指针的内存

#include<stdio.h>
int main()
{
    int a = 10;//a在内存中要分配空间的 - 4个字节
    printf("%p\n", &a);//%p 专门用来打印地址的
    //&a中&是取地址操作符,&a就是取出a的地址,比如0x0012ff40

    int * pa = &a;//pa是用来存放地址的,在C语言中pa叫是指针变量,pa=&a
                  //* 说明 pa是指针变量;int 说明pa执行的对象是int类型的

    *pa = 20;//解引用操作符,意思就是通过pa中存放的地址,
             //找到pa所指向的对象,*pa就是pa指向的对象,*pa=a

    char ch = 'w';
    char * pc = &ch;
    return 0;
}

9.2指针内存的大小 

//不管是什么类型的指针,都是在创建指针变量
//指针变量是用来存放地址的
//指针变量的大小取决于一个地址存放的时候需要多大的空间
//32位机器上的地址:32bit位 - 4byte,所以指针变量的大小是4个字节
//64位机器上的地址:64bit位 - 8byte,所以指针变量的大小是8个字节

#include<stdio.h>
int main()
{
    printf("%zu\n", sizeof(char*));//4
    printf("%zu\n", sizeof(short*));//4
    printf("%zu\n", sizeof(int*));//4
    printf("%zu\n", sizeof(long*));//4
    printf("%zu\n", sizeof(long long*));//4
    printf("%zu\n", sizeof(float*));//4
    printf("%zu\n", sizeof(double*));//4
    return 0;
}

10.结构体 

#include<stdio.h>
//学生
struct Stu
{
    //成员
    char name[20];
    int age;
    char sex[10];
    char tele[12];
};
void print(struct Stu* ps)
{
    printf("%s %d %s %s\n", (*ps).name, (*ps).age, (*ps).sex, (*ps).tele);
    //->
    //结构体指针变量->成员名
    printf("%s %d %s %s\n", ps->name, ps->age, ps->sex, ps->tele);
}
int main()
{
    struct Stu s = { "zhangsan", 20, "nan", "15926589087" };
    //结构体对象.成员名 
    printf("%s %d %s %s\n", s.name, s.age, s.sex, s.tele);
    print(&s);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 目标检测的定义 目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。 目标检测任务可分为两个关键的子任务,目标定位和目标分类。首先检测图像中目标的位置(目标定位),然后给出每个目标的具体类别(目标分类)。输出结果是一个边界框(称为Bounding-box,一般形式为(x1,y1,x2,y2),表示框的左上角坐标和右下角坐标),一个置信度分数(Confidence Score),表示边界框中是否包含检测对象的概率和各个类别的概率(首先得到类别概率,经过Softmax可得到类别标签)。 1.1 Two stage方法 目前主流的基于深度学习的目标检测算法主要分为两类:Two stage和One stage。Two stage方法将目标检测过程分为两个阶段。第一个阶段是 Region Proposal 生成阶段,主要用于生成潜在的目标候选框(Bounding-box proposals)。这个阶段通常使用卷积神经网络(CNN)从输入图像中提取特征,然后通过一些技巧(如选择性搜索)来生成候选框。第二个阶段是分类和位置精修阶段,将第一个阶段生成的候选框输入到另一个 CNN 中进行分类,并根据分类结果对候选框的位置进行微调。Two stage 方法的优点是准确度较高,缺点是速度相对较慢。 常见Tow stage目标检测算法有:R-CNN系列、SPPNet等。 1.2 One stage方法 One stage方法直接利用模型提取特征值,并利用这些特征值进行目标的分类和定位,不需要生成Region Proposal。这种方法的优点是速度快,因为省略了Region Proposal生成的过程。One stage方法的缺点是准确度相对较低,因为它没有对潜在的目标进行预先筛选。 常见的One stage目标检测算法有:YOLO系列、SSD系列和RetinaNet等。 2 常见名词解释 2.1 NMS(Non-Maximum Suppression) 目标检测模型一般会给出目标的多个预测边界框,对成百上千的预测边界框都进行调整肯定是不可行的,需要对这些结果先进行一个大体的挑选。NMS称为非极大值抑制,作用是从众多预测边界框中挑选出最具代表性的结果,这样可以加快算法效率,其主要流程如下: 设定一个置信度分数阈值,将置信度分数小于阈值的直接过滤掉 将剩下框的置信度分数从大到小排序,选中值最大的框 遍历其余的框,如果和当前框的重叠面积(IOU)大于设定的阈值(一般为0.7),就将框删除(超过设定阈值,认为两个框的里面的物体属于同一个类别) 从未处理的框中继续选一个置信度分数最大的,重复上述过程,直至所有框处理完毕 2.2 IoU(Intersection over Union) 定义了两个边界框的重叠度,当预测边界框和真实边界框差异很小时,或重叠度很大时,表示模型产生的预测边界框很准确。边界框A、B的IOU计算公式为: 2.3 mAP(mean Average Precision) mAP即均值平均精度,是评估目标检测模型效果的最重要指标,这个值介于0到1之间,且越大越好。mAP是AP(Average Precision)的平均值,那么首先需要了解AP的概念。想要了解AP的概念,还要首先了解目标检测中Precision和Recall的概念。 首先我们设置置信度阈值(Confidence Threshold)和IoU阈值(一般设置为0.5,也会衡量0.75以及0.9的mAP值): 当一个预测边界框被认为是True Positive(TP)时,需要同时满足下面三个条件: Confidence Score > Confidence Threshold 预测类别匹配真实值(Ground truth)的类别 预测边界框的IoU大于设定的IoU阈值 不满足条件2或条件3,则认为是False Positive(FP)。当对应同一个真值有多个预测结果时,只有最高置信度分数的预测结果被认为是True Positive,其余被认为是False Positive。 Precision和Recall的概念如下图所示: Precision表示TP与预测边界框数量的比值 Recall表示TP与真实边界框数量的比值 改变不同的置信度阈值,可以获得多组Precision和Recall,Recall放X轴,Precision放Y轴,可以画出一个Precision-Recall曲线,简称P-R
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值