数据结构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 |
++ | 增1 | a++,++b |
– | 减1 | a–,--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
- 当 break 语句出现在一个循环内时,循环会立即终止
- 它可用于终止 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语言的内存四区