自学入门c语言(第一次使用测试)

c语言笔记

c语言编程预备知识

数据类型

整数

整形 int 4个字节

短整型 short int 2个字节

长整型 long int 8个字节

浮点数(实数)

单精度浮点数 float 4个字节

双精度浮点数 double 8个字节

字符

单个字符 char 1个字节

符合数据类型

结构体

枚举

共用体

变量为什么必须初始化

初始化就是赋值的意思

如何定义变量

数据类型 变量名 = 要付的值;

等价于

数据类型 变量名;

变量名 = 2;

int i = 3 ;

int i;

i = 3;

int i , j;

常量在c语言中如何表示
整数

十进制 传统写法

十六进制 0x 0X

八进制 前面加0不是o

浮点数

传统写法+科学技术法

float 3.23e3

字符

单个字符用单引号括起来

‘a’表示a

‘ab’不对

字符串用双引号括起来

“a”这也是正确的

代码的规范化
不同类型数据之间相互赋值的问题

只要c c++有这个问题 在java等会报错

ASCII 码
基本的输入与输出函数

printf("")

scanf()

printf 用法

1printf(“字符串\n”);

2printf("%输出控制符,i")

3可以多个printf("%输出控制符 %输出控制符%输出控制符“,i,a,b)

对变量的输出控制全部在前面体现 后面只写变量名称

%d %ld %f %c %lf %x %X %#x %#X 十六进制 2f 2F 0X2f 0X2F

scanf

scanf就是printf 的逆运算 printf输出 scanf输入

事实上可以拆解printf 和scanf组成部分

printf、scanf ()括号内表示对变量的控制

紧接着 “非输出、入控制符输出、入控制符”, 变量/变量地址

在这里 非输出(入)控制符并不改变形式 在printf中原样表现在显示器上

在scanf 输入时必须添加这个值 否则输入无效

输出、入控制符控制输出的形式或者输入的形式(二进制、十进制、十六进制等等)

而在这之后,按顺序添加变量名称表达要控制的是哪个变量。

对于这一点, printf直接输变量名字就可以,因为他是在控制变量 而scanf输入实际上是在对一段存储空间进行改写,直接取该空间的地址即可。

printf控制的变量就会在输出时取代输出控制符输出

(“% ” “% ” “% ”, ,,)

对scanf非输入控制符必须原样输入

对printf非输出控制符一定会原样输出

如何使用scanf编写出高质量代码

1使用scanf之前最好先使用printf提醒用户以什么样的方式输入

2scanf尽量不要使用非输入控制符 别把\n带进来

3scanf对用户非法输入的控制

可能会有垃圾值遗留

比如123输入成了123m这样的话前面会输入123 而下一个scanf会读入m引起错误

希望能清理前面的垃圾值

用while循环实现

运算符

算术运算符

±*/%(取余)

关系运算符

= < <= == !=不等于

逻辑运算符

非!并且与 && 或||

赋值运算符

= += *= /= -=

a+=3 a=a+3

优先级别

算术运算符>关系>逻辑>赋值

还有自增 自减 三目运算符 逗号表达式

自增

分类

前自增 ++i

后自增 i++

相同 最终都是i的值加1

不同

前自增 整体表达式是i+1之后的值

后自增 整体表达式是i +1之前的值

尽量屏蔽掉前后自增的差别

自增表达式最好不要作为一个更大的表达式的一部分来使用

i++ ++i单成语句 不要当成一个完整复合语句的一部分来使用

三目运算符 A?B:C

if (a)

b;

else

c;等价用的很少

逗号表达式

A,B,C,D

从左到右执行

格式(A,B,C,D)

最终

除法两者都整数的话直接只保留整数位舍弃小数位

如果两者有一个是浮点数,则保留浮点小数

取余的正负只和被除数一样

流程控制
顺序执行
选择执行

定义 根据情况选择是否执行

if的用法

1最简单的用法

if(表达式)

语句

功能:表达式为真才执行

2范围问题

只控制相邻近的语句

if()

语句a;

语句b;

只控制a

控制多个if()

{语句a;

语句b;

}

3if else

4 if (else if) else

if (1)

else if(2)

else if(3)

else(4)

1234一个一个往下判断,直到找到真语句执行

一旦找到真语句就不再判断其他只执行这一个

比如说

if 和else if if为真就不做else if了

5c语言对真假的处理

6if举例 求分数的等级

7if常见问题解析

switch的用法

switch(variable)

{ case 1:

break;

case 2:

break;

case 3:

break;

default:

break;

}

选一个执行看选123还是什么

1234是程序的入口找到入口以后一直向下执行到底没有入口从default进,一直执行到break

循环执行

定义:

某些代码重复执行

分类

for

for(定义变量初始值;定义控制范围条件;定义叠算方式)

​ 2 3

{

所需循环的内容

​ 4

}

逆时针倒三角反复循环2432

while循环

while(表达式)

语句;

1执行顺序

2与for的相互比较 for和while可以相互转换

3举例

5什么时候使用while,什么时候使用for

do while

主要是用于人机交互

do

{

}

whhile(表达式);

break 和 continue

BREAK的用法

break 终止循环 直接终止结束距离它最近的循环

break终止switch 终止距离最近的break

continue的用法

用于跳过本次循环余下语句,转去判断是否需要下次循环

for(1;2;3)

{a;

b;

continue;

c

d;

}

cd会一直被跳过,不执行

(这三个的组合就可以解决一切的问题)

浮点数的存储问题

float和double都不能保证可以精确的存储一个小数,它存储的是近似值

如何判断浮点型变量x的值是不是0?

if(|x-0.000001|<0.000001)

else

不是

为什么循环更新的变量不能定义成浮点型

可能有100.000001,99.99999

会导致有一次循环错误

i只能定义成int

所以可以用在要运算的时候把1换成1.0 搞个1.0*sum之类的规避这个问题 当然也可以(float)(sum)强制转换

数组

为什么需要数组?

为了解决大量同类型数据的存储和使用。

为了模拟现实世界

数组的分类

一维数组

怎样定义一维数组

为n个变量连续分配存储空间

所有的变量数据类型必须相同

所有变量所占的字节大小必须相等

例子int a[5]

有关一维数组的操作

初始化

完全初始化 int a[5]={1,2,3,4,5};

不完全初始化int a[5]={1,2,3};未被初始化的元素自动为零。

不初始化

int a[5];所有元素都是垃圾值

int a[5]={0};清零

int a[5] ;

a[5] = {1,2,3,4,5};错误的,只有定义数组时可以整体赋值,平时不可以 这表示一个元素

int a[5] = {1,2,3,4,5}

用已知数组给变量数组赋值时,要用循环赋值没有别的办法,for()b【i】=a【i】

赋值

排序

求最值

二维数组

int a[3][4]总共12个元素3行4列,这12个元素

``a[0][0]a[0][1]a[0][2]a[0][3]`

a[1][0]a[1][1]a[1][2]a[1][3]

a[2][0]a[2][1]a[2][2]a[2][3]

初始化int a[3][4] = {1,2,3,4,5,6,7,8,9,0,1,2};

{{1,2,3,4},

{1,2,3,4},

{1,2,3,4}

};

多维数组``

注意跨界数组的结果是未定义,其实就是用指针在读取未经分配的空间,会导致数据遗失或者程序崩溃。

另外c语言规定数组自动占用了其后面一个同类型变量的位置,为了用指针传递数组时方便终止函数。

跨函数使用数组的保存。非动态分配的一切数组,定义时自动确定大小,不可改变,除非通过特定指令扩充,不会自动扩充

char str[]="hello";
空格内会自动补6补‘\0'
int array[]={1,2,3};
空格内也会自动填上3


跨函数调用数组的时候,只要发送了数组名,也就是地址,就可以随便更改,保存内容到main函数中,只用在调用函数中修改数组就行了,就相当于把main函数数组拿过来用了。

函数

为什么需要函数

避免重复性操作,有利于程序的模块化

什么叫函数

逻辑上:能够完成特定功能的代码单元

物理上:能够接受数据 能够对接受的数据进行处理 能够返回结果

如何定义函数

函数的返回值(函数类型、返回类型) 函数名字(形参列表)

{

韩数执行体

}

return表达式的含义

函数返回值的类型也称为函数的类型

如果return 后面和名字前面类型不同,最终以名字前面的类型为准 而不是以return后面的值为准

return是用来终止函数的,只要一运行return函数立即终止,回到主调函数继续向下执行并返回return后面的值,没有返回值就不返回了

函数的分类

有参数无参数函数

有无返回值

库函数或者自定义函数

普通函数和主函数(main函数)

一个函数必须有且只能有一个主函数

主函数可以调用普通函数

普通函数不能调用主函数

主函数是程序的入口和出口

注意的问题

函数的调用放在了定义的前面,要先说函数是什么,再用,要不然就要提前声明

函数的声明是一个语句,结尾必须加分号

对库函数的声明是通过 # include<库函数所在的文件的名字.h>实现的

常用的系统函数

形参和实参 形式是抽象的 形式的 代表量(用字母表示数)实参是带进去的实际用的值

如何在软件开放中合理的设计函数来解决实际问题

专题:

递归

被调函数修改主调函数普通变量的值

1实参必须是主调函数该普通变量的地址

2对应形参为指针变量

3在被调函数中通过*形参名 获取对应地址位置内存读写权

动态内存的分配

传统数组的缺点:

1数组长度必须事先制定,且只能是常整数,不能是变量

2传统数组定义的数组,该数组的内存程序员无法手动释放;

3函数内的数组在函数运行后自动释放,这也影响了后续代码对前面数组的处理

4无法跨函数使用,会被释放

为什么需要动态内存分配

传统数组又叫静态数组

动态数组解决了这些问题

malloc(int)函数请求系统分配int个大小的字节空间,同时它的返回值是第一个字节的地址

前面必须加(int*)告诉他到底是什么类型(char*)就是看多少个字节成为一个变量

动态内存分配举例 动态数组的构造

静态内存和动态内存的比较

静态内存是由系统自动分配的,由系统自动释放

静态内存是在栈分配的

跨函数使用内存的问题

结构体

为什么需要结构体

为了表示一些复杂的事物,普通的基本类型无法满足实际要求

什么叫结构体

把一些基本类型的数据组合在一起形成的一个新的复合数据类型

如何定义结构体

如何使用结构体变量

赋值与初始化

定义的同时可以整体赋值

定义完之后只能单赋值

如何取出结构体变量中的每一个成员

结构体变量名。成员名

指针变量->age=88(提前设好指向)

pst->age会被计算转化为(*pst).age

pst->age的含义

pst所指向的那个结构体变量中的age成员

结构体变量的运算

结构体变量和结构体变量指针作为函数参数传递的问题

举例

动态构造存放学生信息的结构体

枚举

什么是枚举

枚举是把一个事物所有可能的取值一一列举出来

怎样使用枚举

枚举的优缺点

补码

原码 符号-绝对值码

最高位0表示正1表示负,其余二进制位使该数字绝对值的二进制位 -5 10101

简单易懂,加减运算复杂,加减乘除的四种运算增加了运算的复杂度

零的表示不唯一

补码

十进制转二进制

二进制转十进制

正整数、负整数、零转二进制

正整数转二进制

除2取余,直至商为零,余数倒序排序左边自动补0

负整数转二进制

先求正整数的二进制代码,所有位取反末尾加1,不够位数左边补1

-3 011 100 101 补29个1

零的二进制全是零

已知二进制求十进制

如果首位是0 正常求

如果首位是1,先取反,末尾+1所得数字就是该负数的绝对值

互为逆运算

因而 int 取值范围 (231-1)—(-231)

反码

运算不便,也没应用

移码

表示数值平移n位,n称为移码量

移码主要用于浮点数的阶码的存储

在vc++一个int类型的变量所能存储的数字的范围是多少

最小负数的二进制代码是多少

最大正数的二进制代码是多少

已知一个整数的二进制代码求原始的数字

链表:

算法:通俗定义:

方法和步骤

狭义定义

对存储数据的操作

广义定义

广义的算法也叫泛型

无论数据是如何存储的,对该数据的操作都是一样的

数组的

优点

存取速度快

缺点

需要一个连续的很大的内存

链表

优点

插入删除元素的效率高

不需要一个连续的很大的内存

缺点

查找某个元素效率低

链表术语

头结点

头结点的数据类型和首节点的类型一模一样

头结点是首节点前的节点,并不存放有效数据

设置头结点的目的是为了方便对链表进行操作

头指针

存放头结点的指针变量

首节点

存放第一个有效数据的节点

尾节点

存放最后一个有效数据的节点

位运算符

&–按位与

&&逻辑与 完全不同

二进制每一位进行相与& 比如说21 是 00010101 对7进行相与21&7 7 00000111

那么就有 00010101

​ 00000111就是每一位进行与的运算有一个假就是假 1与0 0 1与1是1 0与0是0 00000101

|按位或 每一位进行或运算 有一个1就是1(真)

~

就是把所有位取反

再读的时候就要用到补码的知识

^按位异或

相同为零

不同为1

1^0 = 1

<<按位左移

i<<表示把i的所有二进制位左移1位左移n位相当于乘2的n次方

位运算符

可以把控制值精确到二进制的每一位

符号常量
# define upper 20
# define 名称 替换文本

在所有位置该名称会被替换文本代入

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值