014-C语言复习
一、C语言中的基本概念
1)程序:为了控制计算机而编写的指令的集合;
程序=数据结构(做菜中用到的容器)+算法(做菜的步骤);
编写程序的工具:C,C++,PYTHON, JAVA GO,JS,C#;
2)软件:软件=程序+数据+文档
软件分类:
操作系统软件:主要负责系统资源的一个分配和任务的调度;
应用软件:为了实现某一个功能而编写的程序;
3)标识符:在计算机中,可以用作名字的字符集合;
只能包含字母,数组和下划线组成;
不能以数组开头;
不能使用C语言中的关键字;
二、C语言的特点
1)C语言是一门高级的面向过程的编译型语言
2)执行效率比较高
3)可移植性比较强
三、C语言的开发步骤
编辑程序》》编译程序》》执行程序
printf(“hello world”) >>编译>>11010001001
编译程序细分为以下几个步骤:
预处理》》编译》》汇编》》链接》》可执行程序
.i>>.s>>.o
四、开发C程序的工具
linux: vim(它是一个编辑器,负责代码的编写) +gcc (编译器)
code::blocks
windows : dev-c++(不推荐),vs
编写一个程序: vim C语言的源文件名
编译程序: gcc 源文件名 或者 gcc -o mytest 源文件名
执行程序: ./a.out ./mytest
五、变量与常量
变量,常量是构成我们程序的一个最小的单元;
常量:在程序的执行过程中不被改变的量(比如人的性别)
整数类型: 描述年龄
小数类型(浮点类型):描述体温,体重
字符串:描述人的爱好
字符类型
变量:在程序执行过程中可以被改变的量(比如人的年龄,体温)
变量定义: [存储类型] 数据类型 变量名;
存储类型:[static/auto/register/extern]
数据类型:[int/short/long/float/double/char]
变量名:符合标识符的规则
变量的初始化:
两种方式: 定义时直接初始化 int a=10;
先定义后初始化: int a; a=10;
使用变量主要:
1)变量一定要先定义,后使用;
2)变量名的命名做到见名知意;
3)命名变量的时候,一个单词不能表达其意思,可以用多个单词进行描述: getValue ,get_value;
4 )变量命名时候一般要用小写,C语言对大小写是敏感的。
5)多个文件引用的公共全局变量,建议在变量名前加上模块名: GUI_getValue;
六、C语言中的数据类型
- C语言中的基本数据类型:整数类型(short, int, long),浮点类型又叫实型(float ,double),字符类型(char)C99标准新增:布尔类型bool,(只有两个值true false),包含头文件 “stdbool.h”;
- 构造类型:数组,结构体,共用体 ,枚举;
- 指针类型;
- 空类型 void ,可以用来修饰指针变量,还可以用来修饰函数类型 void *a;
1)整数类型(int)
整数类型: short [int], int , long [int] ,区别在于表示数据的范围不一样;
2 4 >=4
类型修饰符:signed , unsigned ,通过类型修饰符指定一个变量是否可以表示一个负数
[signed] int a; //定义变量 没有显示的指定类型修饰符,则认为是有符号的
unsigned int a;
整形的常量后加上一个大写的L或小写的l用于指定这个常量是一个长整形
分类: 十进制整数:10,8080 0~9
八进制: 以0开始 012 0~7
十六进制:以0x或者0X开头 0xa 0~9 a~f
二进制:0b1010 0~1 部分编译器支持
十进制转换二进制: 依次除2 保留余数, 从下往上
二进制整数转十进制: 依次程序2的对应位次方,最后依次相加
小数转换成二进制:
0.125 对小数部分乘2,取整数放在小数点的后边,只能小数点后是0为止
0.125 *2==0.250===0
0.250*2===0.5 ====0
0.5*2====1.0====1
1.0*2====x 停止转 0.125=== 二进制小数 0.001
二进制小数转换成十进制小数:从小数点后开始,依次乘以2的负一次方 ,负二次方 依次类推
二进制小数:0.001
换算为十进制小数位:0*1/2 +0*1/4+1*1/8==0.125
2)浮点类型又叫实型
分两种:float double
1)2.3f 默认写的小数其实是一个double,如果在其后加上一个f则表示未单精度类型
2)signed , unsigned 可以修饰我们的浮点类型(有符号,无符号)
3)float 占4个字节,double 8个字节
IEEE 754规则定:(-1)^S*M*2^E
float(4byte): 5.5 ===101.1
S E M
- -------- ----------------------------
1bit 表示小数的正负 ===S ,s=0表示是一个正数 0
8bit 表示指数位 2 (1.011*2^2)
23bit 有效数据 1.011
IEEE 754规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上,很少使用)与延伸双精确度(79比特以上,通常以80位实现)。 只有32位模式有强制要求,其他都是选择性的。
3)字符类型(char)
本质上来说一个单字节的整数类型;
1# 如果表示一个字符类型 ,用单引号进行包裹 ‘a’ 存放ASCII标准定义的字符
2# 表示范围 -127 ~128 无符号:0~255
3# 字符类型存储的时候,存的是该字符对应的编码值: ‘A’===65
4# 字符类型可以直接和整数类型进行常规的运算 : ‘A’>10
4) 补充:
如何定义一个符号常量:
#define KY 20
//符号常量名建议大写
如何定义一个常变量:
const 数据类型 变量; //定义一个只读变量
七、类型转换
类型转换:隐式转换,强制类型转换
隐式转换:char>>short>>int>>long>>double
float>>double ‘a’+2.3
两个不同的类型进行运算的时候: ‘a’+10
赋值的时候: int a=‘A’;
参数传递: test(2.3f) ; void test(double f1);
int a=2.3;
强制类型转换: (类型名)(表达式)
int a=2; (double)a;
运算符的优先级:表达式在参与运算符,优先根据优先级的顺序执行,如果优先级一样,则按结合方向进行运算
1+2*3/5
*p++===*(p++)
八、标准的输入与输出语句
- 使用标准输入与输出语句,需要先包含对应的头文件 #include “stdio.h”
- 标准输出语句: printf(“格式化字符串”,[参数列表]);采用不定长的参数 stdarg
格式符串: 普通字符,格式化字符(%d,%s,%c,%f,%p)
1#参数列表不是必须的,可以省略
2#格式化字符个数要和参数个数要一致,类型也要一致: printf(“%d–%d”,11.2,22);
3# 打印一个带%字符,输入两个%%; printf(“%d%%”,20); ====20%
putchar('A')
- 标准输入语句: scanf(“格式化字符串”,[参数列表]);
1# 格式化字符串尽量只包含格式化符,不要包含普通字符
scanf("%d--%d",&a,&b);
printf("%d",a);
getchar()
九、程序结构
程序三大结构:顺序结构,选择结构,循环结构
顺序结构:
程序语句从上往下依次执行。
int a=10;
int b=3;
a=a+b;
选择结构:
根据条件是否满足来确定某个语句块是否被执行
int a=x
if(a==red)
printf(“not pass”);
else
printf(“pass”);
选择结构: 单分支结构,双分支结构,多分支结构
单分支结构:
if(条件表达式)
{
语句块
}
1#条件表达式:可以有1个也可以有多个
2#当有小括号中有多个表达式的时候,一般用逻辑运算符(&&,||,!)进行连接
3# 根据条件表达式计算结构,如果是一个0 表示不成立,如果不是0 就表示是成立
4# 即使语句块只有1条语句,大括号最好加上。
双分支结构:
if(条件表达式)
{
语句块 //再嵌套if结构
}
else if(条件表达式)
{
语句块 //再嵌套if结构
}
多分支结构:
if构建多分支结构, switch构建多分支结构
if(条件表达式)
{
语句块 //再嵌套if结构
}
else if(条件表达式)
{
语句块 //再嵌套if结构
}
else if(条件表达式)
{
语句块 //再嵌套if结构
}
...
else
{
语句块 //再嵌套if结构
}
switch(表达式)
{
case 常量表达式:语句块;break;
case 常量表达式:语句块;break;
case 常量表达式:语句块;break;
case 常量表达式:语句块;break;
default : 语句块;
}
1# 先对表达式求值,然后依次比较case后的常量,如果相对,则执行对应的语句块
2#执行语句块后没有break,则会将剩余的语句块全部执行完。,注意语句块有break和没有break的指向差别
3#case后边必须是一个常量值或一个常量的表达式,不能时变量
4# case 后的常量都没有匹配上,才会执行defualt后的语句块
5#defualt可以省略
6# switch后的表达式计算结构只能是一个整数或字符型(char)
循环结构:
根据循环条件是否成立来重复执行某一个语句块;
1) for循环
for(初始表达式;条件表达式;更新表达式)
{
循环体;
}
1# 初始表达式只会被执行一次 ,初始表达式可以有一个,也可以有多个,也可以一个都没有
for(int i=1;i<=120;i++)
{
printf("学习一天");
}
int i=1;
for(;i<=120;i++) //for(int i,i=0;i<=120;i++)
{
printf("学习一天");
}
2#条件表达式可以有多个,也可以一个都没有,条件表达式成立则执行循环体,不成立,就会跳出for循环
for(int i=0,y=3;i<=120 && y==30;i++)
3# for循环的执行流程:
初始化表达式》》执行条件语句Y>>循环体》》更新表达式》》执行条件》》循环体。。。。》》条件语句N则跳出循环
4#用for构建死循环: for(;;)
,如果条件表达式被省略,则认为是成立
2) while循环
while(条件表达式)
{
循环体
}
while(1)
{
}
1#执行流程:先检测条件表达式是否成立,然后再确定是否执行循环体;
int i=1;
while(i<=120)
{
printf("学习一天");
i++;
}
2#循环结构的选择: 如果循环次数比较确定的情况下,推荐使用for循环,如果不确定循环次数,推荐使用while(循环);
3) do…while
do
{
循环体
}
while(条件表达式);
特点:循环体至少被执行一次
4)goto关键字构建循环
goto是一个无条件转移语句,
语法格式: goto 语句标号;
跳转的标号处: 语句标号:语句块
注意:1)goto只能在一个函数内部进行跳转,不能跨函数进行跳转
2)goto会破坏程序的层次性,所以在程序中尽量少用。
int sum=0
for(int i=0;i<=5;i++)
{
sum=sum+i;
}
print("%d",sum);
//计算1到5之和 goto向前跳转
int i = 0, sum = 0;
ss: if (i <= 5)
{
sum = sum + i;
i++;
goto ss;
}
printf("%d\n", sum);
//向后跳转
int sum = 0;
for (int i = 0; i <= 5; i++)
{
if (i >= 3)
{
goto ss;
}
}
ss:printf("%d\n", sum);
printf("end");
小结:
如果我们要结束一个循环:
1)等待条件语句不成立的时候
2)在循环体中使用break这个关键字
3)goto这个关键字可以帮助我们跳出循环
4)return可以结束一个循环
continue:结束本次循环,但是不会跳出;
十、数组
(高级的数据类型,同时它也是一个构造类型)
1)为什么要引入数组:构建一群匿名变量的集合;
2)数组的定义:存放相同数据类型的有序集合;
3)特点:
数组中的每一个元素的类型要相同;
有序的,通过索引对其进行访问;
4)定义数组类型: 类型名称 数组名[常量表达式];
int arr[10];
1#数组名也要符合标识符的规则
2#[]中不能包含变量
5)初始化数组(完全初始化,部分初始化)
完全初始化: int arr[3]={11,22,33};
部分初始化: int arr[4]={11,22} ; //剩余未初始化的将被赋值为0 ;
int arr[4]={0}; //将数组中的所有元素全部初始化为0;
6)访问数组中的元素: 数组名[索引];
//索引只能是一个大于等于0的整数,小于数组的元素个数
7)修改数组中的一个值: 数组名[要修改元素的索引]=新值;
arr[1]=100;
- 用printf打印一个数组的时候,它是不会打印出数组中的所有元素,需要通过循环遍历才可以;
for(int i=0;i<4;i++)
{
printf("%d",arr[i]);
}
#define LEN 10
int arr[LEN];
9)如果计算数组中 的元素个数: sizeof(数组名)/sizeof(数组名[0]);
在C语言中,数组名代表首元素的地址,也是一个指针常量,
10)二维数组
int arr[3][4]; //代表有3行4列,存放3个一维的数组,第一维数字可以省略 但是最后一维不可以省略
int arr[3][4]={
11,22,33,
。。。。
}
11)字符数组
char 数组名[元素的个数];
初始化: char ch[3]={‘a’,‘b’,‘c’};
char ch[3]={“abc”};
char ch[3]=“abc”;
在C语言中,C语言并没有提供字符串类型,它是通过字符数组来表示一个字符串
char ch[3]={'a','b','\0'};
printf("%s",ch);
'a' "a"
C语言也提供了一些处理字符串的函数:
首先要包含对应的头文件:#include <string.h>
1)获取长度: strlen() 获取字符串中字符的个数 不包括\0
2)拼接字符串: char *strcat( char *str1, const char *str2 );
char ch[20] = “yueqian”;
printf(“%s”,strcat(ch, “ljs”));
3)比较字符串: int strcmp( const char *str1, const char *str2 );
4)字符串的复制: char *strcpy( char *to, const char *from)
char ch1[20] = “yueqian”;
char ch2[20] ;
strcpy(ch2,ch1)
指定个数进行复制:char *strncpy( char *to, const char *from, size_t count );
5)strstr
#include <ctype.h>
1 int isalnum(int c)
该函数检查所传的字符是否是字母和数字。
2 int isalpha(int c)
该函数检查所传的字符是否是字母。
3 int iscntrl(int c)
该函数检查所传的字符是否是控制字符。
4 int isdigit(int c)
该函数检查所传的字符是否是十进制数字。
5 int isgraph(int c)
该函数检查所传的字符是否有图形表示法。
6 int islower(int c)
该函数检查所传的字符是否是小写字母。
7 int isprint(int c)
该函数检查所传的字符是否是可打印的。
8 int ispunct(int c)
该函数检查所传的字符是否是标点符号字符。
9 int isspace(int c)
该函数检查所传的字符是否是空白字符。
10 int isupper(int c)
该函数检查所传的字符是否是大写字母。
11 int isxdigit(int c)
该函数检查所传的字符是否是十六进制数字。
//编写一个程序,检测我们输入的字符串是否同时包含大写字母,小写字母和特殊符号
#include <stdio.h>
#include <ctype.h>
#include <string.h>
/* int main()
{
int i=0,sum=0;
ss:if(i<=5)
{
sum+=i;
i++;
goto ss;
}
printf("%d\n",sum);
return 0;
} */
int main()
{
int x=0,y=0,z=0;
char a[20]={0};
printf("请输入您的密码:");
scanf("%s",a);
int i;
for(i=0;i<strlen(a);i++)
{
if(a[i]>=65&&a[i]<=90)
x=1;
else if(a[i]>=97&&a[i]<=122)
y=1;
else if(!(a[i]>=48&&a[i]<=57))
z=1;
}
if(x==1&&y==1&&z==1)
printf("密码合法\n");
else
printf("密码不合法\n");
return 0;
}
#include <stdlib.h>
字符串转浮点型或整数类型
atof 字符串类型的值转换成一个 double “2.1”>>2.1
atoi 字符串中的数值转换为一个整数类型 “89”>>89
整数类型或浮点型转换成字符串:
char ch[100] = { 0 };
sprintf(ch, "%d*%d=%d", 10, 20,10*20);
sprintf(ch, "%f", 2.3);
printf("%s", ch);