数据结构C语言(零)

Posted 生命是有光的

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构C语言(零)相关的知识,希望对你有一定的参考价值。

✍、目录总览

  • 估摸着时间这学期要开始回顾数据结构了,提前整一份数据结构的前置知识C语言,用来回忆一下C帝国的知识点。

1、数据类型

1.1、基本数据类型

在标准C语言中,存在着如下六种基本数据类型

基本数据类型描述
char字符型
short = short int短整型
int整型
long = long int长整型
float单精度浮点型
double双精度浮点型

1.2、实型数据

  • 分两类,单精度和双精度 float 和 double
  • float 占用 4 个字节,double 占用8个字节

  • 单精度精确到小数点后第6位,双精度精确到小数点后15位

1.3、字符型数据

  • 字符型数据是用单引号括起来的一个字符,例如 ‘a’、‘b’ 、’=’ 、’+’ 、’?’ 、 都是合法字符型数据
char m = 'a';
  • 字符型数据只能用 单引号 括起来,不能用双引号或者其他括号

  • c 语言中没有 string 类型,string 是用 char 型数组来构造的

char m[5] = {'h','e','l','l','o'};
// 此时 m 就是字符串 hello 了
#include<stdio.h>
int main()
{
	printf("Hello World");
	char name = 'z';
	short a = 3;
	int  age = 222;
	long c = 222222222;
	float money = 22.2;
	double money2 = 22.2222;
	return 0;
}

2、运算符和表达式

2.1、算数运算符

运算符功能说明举例
+a + b
-a - b
*a * b
/a / b
%取模或求余a % b
++增1a++,++b
减1a–,--b

注意:

  • a – 是先用后减
  • – a 是先减后用

2.2、关系运算符

运算符功能说明举例
>大于a > b
>=大于等于a >= 5
<小于3 < x
<=小于等于x <= y+1
==等于x + 1==0
!=不等于c != ‘\\0’

满足返回1,不满足返回0

int c = 1<2;	//此时 1<2,为假,用0表示,所以c=0
int b = 1>=1;	//此时 返回真,所以 b=1

2.3、逻辑运算符

运算符功能说明举例
逻辑非!(x ==0)
&&逻辑与x > 0 && x<100
||逻辑或y < 10 || x < 10
int c = 1;
int b = !c;	//!c代表取反,原来c为1,取反后为0,则 b =0

2.4、三目运算符

  • 条件表达式 b ? x:y

  • 先计算条件b,然后进行判断,如果b的值为 true,计算x的值,运算结果为x的值,否则,计算y的值,运算结果为y的值

2.5、逗号运算符和表达式

  • 逗号表达式的一般形式:(表达式1,表达式2)

  • 先求解表达式1,再求解表达式2.整个逗号表达式的值是表达式2的值

int c = (1+2,2+2);
printf("%d",c);		//c 的值为后面的 2+2 = 4,c=4

2.6、sizeof运算符🔥

  • 用法:sizeof(变量类型) 或者 sizeof(变量名称)
  • 作用:查看字节长度
int a = sizeof(double);
printf("%d\\n",a);		//会发现 a 为 double 类型的字节长度,8个字节,则 a = 8

2.7、赋值运算符和赋值表达式

基本赋值:=

int a = 3;	// 读作把 3 赋给 a

复合赋值:+=-=*=/=%=

a -=b; //等价于 a = a-b

2.8、数据类型转换

  • 自动类型转换
    • 较低类型将自动向较高类型转换

整型类型级别从低到高依次为:

signed char -> unsigned char -> short ->unsigned short -> int -> unsigned int -> long -> unsigned long

浮点型级别从低到高依次为

float -> double

例如:

char c = 'a';
int m=c;	//自动转换,把 'a' 的 ASCII码97 给 m

3、位运算

运算符功能说明举例
~位逻辑反~a
&位逻辑与a & b
|位逻辑或a | b
^位逻辑 异或a ^ b
>>右移位a << 1
<<左移位b >> 4

4、宏常量和常变量

4.1、宏定义

宏定义分为两种

  • 一种是不带参数的宏定义
    • 比如: #define PI 3.1415926
  • 一种是带参数的宏定义 #define 宏名称([形参列表]) 替换文本
    • 比如:#define MULTIPLY(x,y) x*y
#include<stdio.h>
#define Sum(x,y) x+y
int main()
{
	int a = Sum(1, 2);
	printf("%d\\n", a);
	return 0;
}

4.2、宏常量

#define PI 3.14159  /* 定义宏常量 PI */
// 宏常量也称为符号常量,是指用一个标识符号来标识常量,切记中间不能加等号

4.3、常变量

常变量:使用 const 定义常变量,定义时需指定数据类型,行末以分号结束

const float PI=3.1415926;
// 注意结尾分号
#include<stdio.h>
const float PI = 3.1415926;
int main()
{
	float a = PI;
	printf("%d\\n", a);
	return 0;
}

5、输入和输出

5.1、数据的输入

  • scanf("<格式化字符串>",<地址表>);
int i,j;
scanf("%d,%d",&i,&j);
// 注意字符串的是 %s, str   str 前面不用加 &
  • getchar()
    • getchar() 函数也是从键盘上读入一个字符,并回显。
    • 它与前面函数的区别在于: getchar() 函数等待输入直到按回车才结束,回车前的所有输入字符都会逐个显示在屏幕上,但只有第一个字符作为函数的返回值,可以吃换行符回车
getchar();
#include<stdio.h>

int main()
{
	char a = getchar();
	printf("%c", a);
	return 0;
}
  • gets();
    • gets() 函数用来从键盘读取字符串直到回车结束,但回车符不属于这个字符串.其调用格式为
gets(s);	//s为字符串变量、字符串数组名或字符串指针
#include<stdio.h>

int main()
{
	char str[10];
	gets(str);	//数组就是地址,不用加&
	printf("%s",str);
	return 0;
}

5.2、数据的输出

  • printf()
int i =10;
int j = 3;
printf("%d%d\\n",i,j);
  • putchar()
char ch = 'h';
// 函数是向标准输出设备输出一个字符
putchar(ch);	//其中ch为一个字符变量或常量
  • puts()
char a[10] = {'h','e','l','l','o'}
// puts() 函数用来向屏幕 写字符串并换行
puts(s);	// s为字符串变量(字符串数组名或字符串指针)

5.3、格式化输出

格式描述
%d🔥十进制有符号整数
%u十进制无符号整数
%f🔥浮点数
%s🔥字符串
%c🔥单个字符
%p指针的值
%e指数形式的浮点数
%x,%X无符号以十六进制表示的整数
%o无符号以八进制表示的整数
%g自动选择合适的表示法
  • 可以在 “%” 和字母之间插进数字表示最大场宽。
    • 例如: %9.2f 表示输出场宽为9的浮点数,其中小数位为2,整数位为6,小数点占一位,不够9位右对齐(前面补0)
    • %8s 表示输出8个字符的字符串,不够8个字符右对齐
  • 可以控制输出左对齐或右对齐,即在 “%” 和字母之间加入一个 “-” 号可说明输出为左对齐,否则默认为右对齐
    • 例如:%-7d 表示输出7位整数左对齐
#include<stdio.h>

int main()
{
	float a = 3.3122;
	printf("%9.2f\\n", a);
    //_ _ _ _ _3.31
	return 0;
}

6、常用计算函数

  • 导入 math.h 库
函数举例作用
求绝对值x = fabs(a)求a的绝对值
开平方x = sqrt(a)求a的平方根(a>=0)
正弦函数x = sin (a)求 sin(a) 的值
e 的幂x = exp(a)求 ea 的值
a 的 b 次方x = pow(a,b)求 ab 的值
log10 (a)x = log10(a)求以 10 为底 a 的对数
向上取整x = floor(a)求不大于 a 的最大的整数
向下取整x = ceil(a)求大于 a 的最小的整数
#include<stdio.h>
#include<math.h>
int main()
{
	int a = -3;
	int b = fabs(a);
	printf("%d", b);
	return 0;
}

6.1、伪随机数

  • 导入 stdlib.h 库
#include<stdio.h>
#include<stdlib.h>
int main()
{
	int a = rand();
	printf("%d", a);
	return 0;
}
  • 发现每次结果都一致(每次启动计算机以后,种子就是定值了)

如何实现每次产生的数不一样呢?

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
	int a;
	/* 将当前时间设置成随机函数的种子,所以每次产生的数都不一样 */
	srand((unsigned)time(NULL));
	a = rand();
	printf("%d", a);
	return 0;
}

7、条件判断

7.1、if else

if(条件表达式1)
{
    //...
}
else if(条件表达式2){
    //...
}
else if(条件表达式3){
    //...
}
else{
    //...
}

注意:如果 {} 里面的语句为 一个简单的语句(一个分号),那么{} 可以省略

#include<stdio.h>

int main()
{
	int score = 99;
	if (score >= 90) {
		printf("A");
	}
	else if (score >= 80) {
		printf("B");
	}
	else if (score >= 70) {
		printf("C");
	}
	else if (score >= 60) {
		printf("D");
	}
	else {
		printf("不及格");
	}

	return 0;
}

如果某个表达式的值为真,则执行对应语句,并终止整个多分支结构的执行。但如果为:

#include<stdio.h>

int main()
{
	int score = 99;
	if (score >= 90) {
		printf("A");
	}
	if (score >= 80) {
		printf("B");
	}
	if (score >= 70) {
		printf("C");
	}
	if (score >= 60) {
		printf("D");
	}
	else {
		printf("不及格");
	}

	return 0;
}

假设第二个表达式为真,后面的 if 还是一样要执行

7.2、switch

  • switch() 中的参数只能是 整型,字符型,枚举型
switch(参数)
{
    case 常量表达式1:
        语句块1;
        break;
    case 常量表达式2:
        语句块2;
        break;
    default:
        语句块n;
        break;		//这个break可以加,可以不加
        
}
#include<stdio.h>

int main()
{
	int score = 82;
	switch (score / 10) 
	{
		case 10:
			printf("满分");
			break;
		case 9:
			printf("A");
			break;
		case 8:
			printf("B");
			break;
		case 7:
			printf("C");
			break;
		case 6:
			printf("D");
			break;
		default:
			printf("不及格");
			break;
	}
	
	return 0;
}

字符型

#include<stdio.h>

int main()
{
	char m = 'A';
	switch (m) 
	{
		case 'A':
			printf("我是A字符");
			break;
		case 'B':
			printf("我是B字符");
			break;
		case 'C':
			printf("我是C字符");
			break;
		case 'D':
			printf("我是D字符");
			break;
		default:
			printf("没有匹配到");
			break;
	}
	
	return 0;
}

8、循环

8.1、while

while(表达式)
{
    语句;
}

当表达式为真,则执行下面的语句;语句执行完之后再判断表达式是否为真,如果为真,再次执行下面的语句;然后再判断表达式是否为真…就这样一致循环下去,直到表达式为假,跳出循环,这个就是 while 的执行顺序

8.2、do-while

do
{
    语句;
}
while(表达式)

do…while 是先执行依次循环体,然后再判别表达式

8.3、for

for(循环变量赋初值;循环条件;循环变量值改变)
{
    语句;
}
for(i=1;i<=100;i++)
{
    sum = sum + i;
}

8.4、循环嵌套

#include<stdio.h>

int main()
{
    int i, j;
    for (i = 0; i < 4; i++)
    {
        printf("我是外层循环\\n");
        for (j = 0; j < 3; j++)
        {
            printf("我是内层循环\\n");
        }
    }
	
	return 0;
}

8.5、break

  1. 当 break 语句出现在一个循环内时,循环会立即终止
  2. 它可用于终止 switch 语句中的 case

8.6、continue

跳过循环体中下边尚未执行的语句,然后进行下一次是否执行循环的判定

9、函数

9.1、函数的定义

#include<stdio.h>

// 函数的定义
int add(int a, int b)
{
	return a + b;
}

int main()
{
    // 函数的使用
	int c = add(1, 3);
	printf("%d", c);		//返回4
	
	return 0;
}

9.2、函数的返回值

函数的返回值是通过函数中 return 语句获得的。return 语句将被调函数中的一个确定的值带回到主调函数中,供主调函数使用。若不需要返回值 void 类型,则可以不要 return 语句。

9.3、函数的声明

#include<stdio.h>

// 函数的声明
int add(int a,int b);

int main()
{
    // 函数的使用
	int c = add(1, 3);
	printf("%d", c);		//返回4
	
	return 0;
}

// 函数的定义
int add(int a, int b)
{
	return a + b;
}



9.4、函数间的参数

  • 实参:全称为 “实际参数” 是在调用时 传递给函数的参数,即传递给被调用函数的值
  • 形参:全称为 “形式参数” 是在定义函数名和函数体 的时候使用的参数,目的是用来接收调用该函数时传递的参数

9.4.1、实参与形参的传递方式

#define _CRT_SECURE_NO_DEPRECATE	//vs2019中需要加此句代码,否则 scanf 报错
#include<stdio.h>	// c语言中的输入输出库


void mySwap(int x, int y)
{
	int t;
	t = x;
	x = y;
	y = t;
}

int main()
{
	int a, b;
	printf("请输入代交换的两个整数:");
	scanf("%d %d", &a, &b);
	mySwap(a, b); //作为对比,直接交换两个整数,显然不行
	printf("调用交换函数后的结果是: %d 和 %d\\n", a, b);

	
	return 0;
}
#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>	// c语言中的输入输出库


void mySwap(int *p1, int *p2)
{
	int t;
	t = *p1;
	*p1 = *p2;
	*p2 = t;
}

int main()
{
	int a, b;
	printf("请输入代交换的两个整数:");
	scanf("%d %d", &a, &b);
	mySwap(&a, &b); //交换变量a 和 变量b 的地址中的内容
	printf("调用交换函数后的结果是: %d 和 %d\\n", a, b);

	
	return 0;
}
#define 零基础学C语言知识总结十一:C语言的内存四区

零基础学c语言书籍,百度云的

从零开始配置vim(27)——代码片段

从零开始配置vim(27)——代码片段

从零开始配置vim(27)——代码片段

❤️《算法和数据结构》小白零基础教学,三十张彩图,C语言配套代码,之 二叉树详解❤️(建议收藏)