论坛首页 编程语言技术论坛

c语言编程基础

浏览 631 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2021-02-20  
C++
数据类型

基本数据类型

类型名称说明char字符类型存放字符的ASCII码int整型存放有符号整数short短整型存放有符号整数long长整型存放有符号整数long long存放有符号整数float单精度浮点型存放精度不高的小数double双精度浮点型存放精度较高的小数

除了这些基本数据类型之外,还有一些复合类型,后面会慢慢讲到.

表格中最常用到的四种类型是 char int float 和double.



类型介绍

根据存放类型的不同,可以大致分为字符型,整型和浮点型

整型

存放整数的类型 比如0 1 2 3 4这种自然数或者负数都可以用整型存放

类型大小范围说明

int4-2^31~2^31-1

short2-2^15~2^15

short(int) 短整型

long4-2^31~2^31-1long (int) 长整型,规定范围不得低于int

long long8-2^63~2^63-1不低于long类型

整型数据需要注意的是 整型数据之间的运算只会得到整型,也就是类似3除以4这种操作得到的不是0.75,而是0



字符类型

字符类型是一种比较特殊的整型,本质上存放的仍然是整数,因此可以和整数一样参与各种计算

类型大小范围说明char1-128~1270~127每个数字代表一个字符,但是不是所有的字符都是可打印字符

ASCII码表,字符类型不需要记这个表格,需要的时候可以查表




浮点型/实型

浮点型指的是小数类型,为什么叫浮点型,参考浮点数二进制计算时候小数点的移动

类型大小范围说明float4-3.4e38~3.4e38单精度浮点型,精确到小数点6~7位double8-1.7e308~1.7e308双精度浮点型,精确到小数点后面16~17位

float内存占用更小,运算速度更高.double类型占用内存大,运算较慢,但是精度更高





变量定义和命名规范

变量和常量

C语言中将在代码中不能变的量称之为变量,不可变的量称之为常量

比如圆周率这种就是常量,关注人数就是变量

定义变量

类型规定了数据存放和使用的方式,现在有一个数据如果要存放的话,就需要用到变量

//定义变量的格式 类型 变量名;inta;

上面代码定义了一个int类型的变量a 这个变量可以在后面赋值,计算,或者显示到屏幕上

命名规范

只能由数字,下划线,字母,美元符号组成

不可以是数字开头

不可以和关键字冲突

有一些名字拿去做其他作用,比如int 代表整型,这些就称之为关键字



命名方式 驼峰命名法

每个变量名由若干个单词组成,除了第一个单词之外,其余单词首字母全部大写.单词可以是缩写。比如 mciSendString





基本输入输出

输入输出函数

printf用于将指定的内容以特定格式输出到屏幕

scanf用于获取用户输入的内容



格式说明

格式占位符作用%d有符号10进制整型%c字符类型%f单精度浮点型%lf双精度浮点型%s字符数组类型%o无符号8进制整型%x无符号16进制整型

输出格式

printf("格式占位符",变量);

输入格式

scanf("格式占位符",&变量);





分支

分支语句

C语言的分支结构主要有if和switch

if

基本格式

if(条件){//语句1}else{//语句2;}//如果条件满足 执行语句1,如果条件不满足 执行语句2

需要注意的事情

条件可以用一个数字作为条件,判断真假按照 0为假以非0为真的规则

写条件的时候注意=和==是不同的运算符 不要弄混

如果条件比较复杂 建议拆成多句,if里面的条件不宜太长,方便阅读

在if后面不要加分号

else部分如果不需要可以不写

如果是if-else嵌套,比如

if(条件1){

      语句1;

}

else if(条件2) {

      语句2;

}



else {

      语句n;

}

当第一个条件不成立的时候才判断条件2

if后面的{}中如果只有一个语句(用分号结尾的语句或者其他if语句都可以),那么可以省略掉{},else并不是必要的,如果else的{}中没有内容 可以不要else





switch

基本格式

switch(变量){case情况1:语句1;breakcase情况2:语句2;break;//... default:break;}

注意事项

sw itch的case后面只能接整型或者字符型的常量表达式,不可以是小数或者字符

sw itch每个case后面都有一个break

default语句如果不需要可以不要





对比

if适应于任何分支情况,三目运算符适合一些比较简单的分支,switch适合可以一一列举所有可能情况的时候

如果是一个范围的话用if比较容易表示,但是如果是单个单个能列举的值,用switch比较简介,比如游戏操作的wasd方向键,菜单的几个功能都可以用switch





循环


循环作用

多次执行的语句就可以使用循环

比如游戏的操作和贴图,这些都是要多次执行的,就会用到循环

分支只会执行一次,但是循环可能会执行多次(会搭配使用)

三大循环语句

while循环

基本格式

while(条件){语句;//循环{}中语句称之为循环体 }//执行顺序 先判断条件 条件满足执行循环体,不满足直接退出

说明

当条件满足的时候执行循环体,执行之后再去判断条件,条件不满足的时候退出

//打印ASCII码表中的所有字符 inti=0;while(i<128){printf("%c\t",i++);}//同一个代码可以有多种不同的写法 熟练使用其中一个循环就好了

注意事项

w hile循环不要加分号

w hile循环体只有一句的时候可以省略{} 但是不要省略

如果条件满足则会一直进行循环,不满足就会退出循环,所以w hile可能一次都不执行





for循环

基本格式

for(初始化1;条件2;自增自减3){循环体4;}//为了描述方便 给每个语句都加了一个编号 //执行顺序 先执行初始化语句1,然后判断条件2,条件成立执行循环体4,不成立跳出循环. //循环体执行完毕之后,执行自增语句3 然后判断条件 开始下一轮循环 //简记 1243 243 243

说明

for循环类似w hile循环 同样是先判断然后执行循环体的,不过for的语法比较简单并且相对于w hile更不易写错,所以可以先从for循环开始熟悉

注意事项

for循环中的两个分号必不可少,其余的部分都可以不要,但是分号必不可少

for循环外面不要加分号!!!! 画重点 if w hile for一般都不要加分号





do while循环

基本格式

do{//循环体; }while(条件);//;不能少//do while循环的特点是先执行循环体然后判断条件,如果条件成立进行下一轮循环 //do while的循环体必定会执行一次

说明

do w hile循环条件放在后面,先执行然后判断,如果条件不成立会退出,不然会继续循环

特别说明

条件一直为真的循环称之为死循环,常用的有w hile(1) 或者for(;;)

for和w hile之间可以相互转换,但是和do w hile不一定可以







跳转语句

跳转语句使用方式作用说明goto跳转到程序的任意位置使用不当会造成代码的可读性差,可维护性差,基本上不用breakbreak;跳出最近的一个循环或者switch如果是循环中的sw itch中的break只能跳出sw itch,如果是多层循环只能跳出最近的一个循环continuecontinue;跳过当前的一轮循环,进入下一轮循环只能和在循环中使用.跳过当前循环,进入下一轮循环returnreturn 返回值;或者return;跳出当前函数主函数中的return会跳出主函数(跳出主函数也就意味着程序结束),其余函数的return是跳出当前的函数.可以跳出多层循环

说明

break,continue这样的跳转语句一般和if搭配使用,满足特定条件才会退出循环或者跳过这次循环

return后面要不要加一个返回值这个根据函数确定,留到函数部分再具体讲解

以上的都是关键字,不需要加头文件,也不可以用作函数或者变量名



跳转函数 exit的说明

exit作用 跳出整个程序,是stdlib.h里面的函数,使用的时候需要加上



常用写法

exit(0);//里面的数字0表示正常退出,其余数字表示异常退出,不影响代码

在任意地方使用均会跳出整个程序





数组

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dzN3NXey-1570415333052)(D:\微信公众号\Typora\素材\潭州vip\数组.png)]

数组

数组作用

存放多个相同类型的元素,如果有多个相同类型的元素需要存放,那么可以使用数组。

//存放3个成绩//方式1 单独定义变量intgrade1,grade2,grade3;//方式2 使用数组intgrade[3];

数组定义和使用方式

数组定义格式 类型 数组名[数组大小];

intarr[16];//定义一个数组 数组中可以存放16个int类型数据

如果你想要定义的时候就给里面的元素赋值的话,可以定义的时候直接用=

intarr[16]={1,2,33,2,4,5,6,1,6,7,7,7,8};//定义的时候给数组元素赋值 //数组元素个数是16,但是后面只有13个值,那么多余的就用0赋值//如果定义的时候给数组元素赋值,可以省略掉数组大小,用后面赋值的个数作为数组的大小 //int arr[]={1,2,3,4,5}; //此处数组大小是5

数组元素使用方式 数组名[下标]

//定义数组之后 相当于同时定义了多个变量,如果要使用这些变量,就用数组名加下标的形式去单独访问其中的元素// [ ] 下标运算符arr[2]=12;//表示给数组中第二个元素赋值(下标从0开始计算)

注意

定义的时候int arr[16]表示对定义数组,除了定义之外的[]全部是下标运算符的意思,所以arr[16]不是数组的意思 而是数组中的一个元素

下标从0开始算,所以注意下数组的下标不可以超过数组的最大元素个数

下标可以使用变量,所以数组可以和循环搭配使用

for(int i=0;i<16;++i) { printf("%d\t",arr[i]); }



二维数组和多维数组

二维数组定义和使用

如果要定义几组数据就要用到二维数组,比如说地图,比如说一个学校有20个班级,每个班级40个学生,这种用一维数组也可以存,不过用二维数组更加方便

定义格式 类型 数组名[ 行 ] [ 列 ] 使用方式 数组名i(使用时候注意,行列都是从0开始的)

//一维数组元素地址打印测试intarr[12]={1,2,3,4};for(inti=0;i<12;++i){printf("%p\t",&arr[i]);}

二维数组的初始化

和一维数组类似,二维数组初始化可以直接在定义的时候赋值

intdouArr1[3][4]={{1,2,3,4},{2,2,3,4}};//每一行单独赋值 intdouArr2[3][4]={1,2,3,4};//先存第一行,然后第二行 以此类推intdouArr3[][4]={1,2,3,4};//省略行 根据后面赋值判断有多少行

如果是定义的时候赋值,二维数组定义的时候可以省略掉行(不推荐省略)

二维数组本质(只做了解)

//一维数组元素地址打印测试intarr[12]={1,2,3,4};for(inti=0;i<12;++i){printf("%p\t",&arr[i]);}//二维数组元素地址打印测试intdouArr[3][4]={1,2,3,4};for(inti=0;i<3;++i){for(intj=0;j<4;++j){printf("%p\t",&douArr[i][j]);//打印地址}printf("\n");}//%p用于打印地址的格式占位符 打印的是16进制形式

分析打印结果,发现这些元素地址都是相邻的. 类似一维数组,实质上二维数组的元素存放方式也是一个个相邻存放的,一行存完之后存下一行,从内存角度看,多维数组和一维数组其实没有什么太大的区别,使用的话,可以用如下方式

for(inti=0;i<12;++i){printf("%d\t",douArr[0][i]);}

基本上二维数组以上的多维数组就用的很少了,规则和二维数组类似,所以掌握了二维数组,多维数组也是一样操作.





字符数组和函数

字符数组和字符串

用双引号括起来的一串内容是字符串,字符串一般用字符数组存储

charstr[20]="hello w orld";//定义字符数组存放一个字符串

字符串末尾都有一个'\0',表示的字符串的结尾,因此在进行和字符串相关的操作,都会用到'\0'



由于字符串末尾有'\0',用字符数组存放字符串需要注意几个事项:

因为数组只有在定义的时候才可以用=赋值,其余情况下不可以直接用=赋值

字符数组可以用循环赋值,但是末尾需要记得加上一个\0

考虑到\0 数组大小不可以太小

字符串有一些常用函数,但凡是字符串(用\0结尾)都可以用这些函数



字符串可以用的一些函数

字符串比较函数 strcmp

字符串拷贝函数 strcpy

字符串链接 strcat

测量字符串长度 strlen

判断一个字符串是否是另外一个字符串的子串 strstr

判断字符串中是否包含一个字符 strch

字符串的输入输出 scanf printf

字符串的输入输出 gets puts





函数

对于一些经常会使用到的(多次 重复使用)的代码可以将它封装成一个函数,C语言程序的基本组成单位就是函数.

函数1

函数使用方式

调用方式 函数名(参数)

调用函数需要先知道函数名,比如getchar scanf这种

如果函数没有参数,那么直接加()即可调用 比如getchar()

如果函数有参数,那么需要在()里面写上参数,比如printf("Hello w orld")

一般函数都是为了执行某项功能,一些经常用到的功能可以写成函数以供调用,调用函数不需要知道函数具体的实现方式(知道他的功能就行)



返回值

对于一些函数会返回一个结果,比如printf他返回打印的元素个数

不同函数的返回值有不同的作用



函数定义方式

函数定义需要包含所有函数的组成部分

需要确定函数作用,参数和返回值,定义函数之后方能使用

函数体根据函数作用书写 写函数的时候需要先设计,最好写注释



函数声明

在调用函数之前定义函数的话就没用任何问题,但是一般情况会将函数定义放在调用函数的后面,这种情况就需要写函数声明

函数声明的作用是告诉编译器去后面找这个函数的定义,也就是他只是刷一下存在感

函数声明需要函数返回值类型 函数名和参数类型,也就是说参数的名字可以省略

intfun(int,int);//函数声明intmain(){fun(3,4);//函数调用getchar();return0;}intfun(intx,inty)//函数定义{returnx>y?x:y;}

形参和实参

形参意义

形参指的是调用函数的时候需要从外部引入的参数

其他函数中的值可以通过传参的方式传给被调用的函数

形参说明了被调用函数中需要哪些外部变量

实参意义

实参是调用函数的时候传递的参数,实参传递给形参,就是从函数中传递值给被调用的函数

实参必须是有一个确切的值才能传递给其他函数

归纳总结

函数声明和定义时候的参数称之为函数的形参

函数调用时候的参数称之为实参

调用就是用实参给形参赋值然后执行函数体

intfun(int,int);//函数声明 形参intmain(){fun(3,4);//函数调用 实参getchar();return0;}intfun(intx,inty)//函数定义 形参{returnx>y?x:y;}



函数2

作用域

变量要先定义然后才能使用,但是 变量定义位置会影响到使用的范围

局部变量

在函数或者{}里面定义的变量,出了{}就不能继续使用

全局变量

在函数外部定义的变量,定义之后整个程序中都可以使用

变量的作用域不一样的话,名字可以相同,使用的时候依据就近原则(最近定义的那个变量).



函数传参

问题1 如果要传递一个数组进去,那么形参和实参要怎么写 问题2 如果想要在函数里面修改实参的值 能不能做到

函数实参实参写法函数形参备注int xxint x基本数据类型直接写就行int arr[128]arrint arr[]一维数组传参的时候数组大小是不写的,需要另外传递进去int douArr[3] [4]douArrint douArr[] [4]二维数组传递参数实参直接写数组名,形参省略行号,但是列不能省略

形参名和实参名可以不一样,这里只是作为示例,不是意味着需要名字相同



递归(偏难)

函数直接或者间接调用自己叫做递归,循环都可以用递归实现

递归只是一种解决问题的方式,关键在于找到递归公式

//示例 求阶乘//思考 n!=1*2*3*4*.....*(n-1)*n//可以得到递归公式 n!=n*(n-1)//当n==1的时候 n!=1intFn(intn)//求n的阶乘{if(n>1){returnFn(n-1)*n;}else{return1;}}

C语言表白程序这样写,99.9%能成功!

http://www.makeru.com.cn/live/5413_2373.html?s=45051

C语言编程基础

http://www.makeru.com.cn/live/1758_311.html?s=45051

C语言

http://www.makeru.com.cn/course/details/2233?s=45051

提升C编程能力

http://www.makeru.com.cn/live/1392_1166.html?s=45051

夯实C语言,从小白到大牛的进阶之路!

http://www.makeru.com.cn/live/5413_1980.html?s=45051
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics