一、Linux命令
Linux的主要特点:
完全免费:用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。
安全性:Linux采取了许多安全技术措施,其中有对读、写进行权限控制、审计跟踪、核心授权等技术,这些都为安全提供了保障。
多用户:可以被不同用户使用,每个用户对自己的资源有特定的权限,互不影响。
多任务:同时执行多个程序,而同时各个程序的运行互相独立。
独立性和可移植性都是说可以适应不同环境,内核都是一样的。
Windows:必选图形界面,上手容易,有文件拓展名,不区分大小写
Linux:可选图形界面,需要有编程基础者使用,不使用文件拓展名,区分大小写
路径分类:
绝对路径 (路径字符串中含根目录的写法)
相对路径 (在一个参考目录位置(当前目录作为参考位置)基础上的一种写法)
有/,绝对路径
C语言代码的编译过程
? 预处理 编译 汇编语言 链接
f1.c f1.i f1.S f1.o
预处理:处理.c文件中#开头的语句
编译:将c语言语句翻译成同功能的汇编指令
汇编:将汇编指令翻译成cpu的二进制指令
链接:按特定规则将所有目标文件打包成与操作系统相匹配的可执行文件
二、c语言预备知识
标识符: 程序员自己可以命名的单词。
命名规则如下:
- 不能是关键字
- 由大小写字母和0~9数字符号以及下划线构成
- 只能以字母或者下划线开头
- 区分大小写
类型的级别从高到低依次是long double,double,float,unsigned long long,long long,unsigned long,long,unsigned int,int。例外的情况下,当long和int的大小相同时,unsigned int 比 long的级别高。之所以short和char类型没有列出,是因为它们已经被升级到int或unsigned int。
常用基本数据类型(64位机器为例)
int %d
float %f
double %lf
char %c %s
long int %ld
常用基本数据类型占用空间
char : 1个字节
int: 4个字节
float:4个字节
double: 8个字节
基本类型书写
整数:
a,默认为10进制,10,20。
b,以O开头为8进制,045,021。
d,以Ox开头为16进制,0x21458adf。
d,以Ox开头为16进制,0x21458adf。
小数:
单精度常量:2.3f。
双精度常量:2.3,默认为双精度。字符型常量
用英文单引号括起来,只保存一个字符'a'、'b'、'*',还有转义字符'\n' 、'\t'。字符串常量
用英文的双引号引起来可以保存多个字符: "abc"。
如“china”字符串 %s 6
如‘c’,’h’,’i’,’n’,’a’单个字符 %c 5
void 和int区别在于有没有返回值
变量定义
类型 变量名;
int num;//类型 int 变量名 num
强制转换
(要强制转换的类型)变量名
记住常用的ASCLL码
比如 A 65 a 97
sizeof(类型)-- 计算字节数
注意%参与运算的对象必须是整型数
自增的类型和用法
i++ i=i+1; 先使用i,再++
++i i=i+1; 先++,再使用i
自减的类型和用法
i-- i=i-1; 先使用i,再--
--i i=i-1; 先--,再使用i
三、三大结构
逻辑运算符
与“&&”
或“||”,注意与和或连接的是两个表达式
非“!”
关系运算符
等于“==”
不等于“!=”
选择结构
if语句
单分支结构:
if(条件表达式){
语句;
}
如果符合“条件表达式”,执行语句
双分支结构
if(条件表达式){
语句1;
}
else{
语句2
}
多分支结构
if(表达式1){
语句1;
}
else if(表达式2){
语句2;
}
else if(表达式3){
语句3;
}
else{
语句4;
}
switch语句
switch(表达式){
case 常量表达式1:
语句1;
break;
case 常量表达式2:
语句2;
break;
case 常量表达式3:
语句3;
break;
...
case 常量表达式n:
语句n;
break;
default:
语句n+1;
}
循环结构
while循环语法:
while(表达式){
循环体;
}
do while循环
do{
循环体;
}while(表达式);
while和do-while区别在于
while先判断,再运行循环语句
do-while先运行循环语句,再判断
需要注意的是,如果一开始输入假,do-while会进行一次操作,运行循环语句,再判断,不符合退出;如果一开始输入假,while先判断,不符合退出。
一开始输入假,两个结果就不一样;一开始输入真,两个是一样的。
常见的死循环:
while(1){
}
不执行:
while(0){
}
字符输出函数:
putchar函数是字符输出函数,其功能是在终端(显示器)输出单个字符。其函数原型为:
int putchar(int ch);
ch表示要输出的字符内容,返回值作用为:如果输出成功返回一个字符的ASC码,失败则返回EOF即-1,如代码:
putchar('A');
putchar(x);
字符输入函数:
getchar函数的功能是接收用户从键盘上输入的一个字符。其一般调用形式为:
getchar();
getchar会以返回值的形式返回接收到的字符。即该字符的ASC码,通常的用法如下:
char c;
c=getchar();
for循环
for(表达式1;表达式2;表达式3){
语句;
}
表达式1:设置初始条件,只执行一次,可以0或者多个表达式赋初始值
表达式2:循环条件表达式
表达式3:作为循环的调整
调用数学函数
添加头文件:#include <math.h>
调用函数:pow(数值,次方)n次方的函数
编译:gcc 名字 -lm
四、位运算
单位的换算:
进制转换:
十进制负整数转换为二进制数:
例如:-29
第一步:先将该负整数对应的正整数转换为二进制数。
十进制数29的二进制数为00011101。
第二步:对得到的二进制数取反。
二进制数00011101取反为11100010。
第三步:加1。
11100010加1为11100011。
因此,十进制数-29转换为二进制数11100011。
补码的应用:
假设两个四位二进制数0111和0110为无符号数,我们来计算一下两者之间的减法:0111-0110=7-6=1。
由于计算机没有减法运算,我们可以先求减数相对应的补数,四位二进制数的模为2^4=16,那么6的补数为16-6=10,也就是说7-6=7+10=17,0111-0110=0111+1010=10001。
因为只有4位,所以最高位省略,得到0001=1,正好是原本的计算结果。
补码的特点:
1. 补码的符号可以看做是数值的一部分参与运算;
2. 在补码表示中,0只有一种表示方法;
3. 负数补码表示的范围比原码稍宽。
位操作符
& 与运算 两个位都是1时,结果才为1,否则结果为0
| 或运算 两个位都是0时,结果才为0,否则结果为1
^ 异或运算 两个位相同则为0,不同则为1
~ 取反运算,1则变为0,0则变为1
<< 左移:左移运算,向左进行移位操作,高位丢弃,低位补0
>> 右移:右移一位相当于/2
五、数组和字符数组
三元运算符
如果条件为真?则值为X:否则值为Y。
max=(a>b)?a:b;
局部变量与全局变量
局部变量:在某个函数或块的内部声明的变量称为局部变量。它们只能被该函数或该代码块内部的语句使用。局部变量在函数外部是不可知的。下面是使用局部变量的实例。在这里,所有的变量a、b和c是maint)函数的局部变量。
全局变量:定义在函数外部,通常是在程序的顶部。全局变量在整个程序生命周期内都是有效的,在任意的函数内部能访问全局变量。全局变量可以被任何函数访问。也就是说,全局变量在声明后整个程序中都是可用的。
循环结束的方法:
continue:结束当前当次循环,继续下一次循环
break:跳出循环
return: 结束方法
宏定义
命名规则:#define 名字 大小
特点:宏定义只代不运算
定义一维数组
定义一维数组的一般形式为:类型符数组名[常量表达式]
数组下标从0开始
冒号排序法:
现在输入10个用户的有效学习时间,要求对它们按由小到大的顺序排序。
解题思路:这种问题是一个典型的排序问题,排序方法是一种重要且基本的算法,我们在此使用“冒泡排序法”,其思路为:每次将相邻两个数比较,将小的调到前面,如果有6个数:8,7,5,4,2,0。第一次先将最前面的两个数8和7对调。第二次将第二个数和第三个数(8和5)对调。如此总计进行了5次,得到7-5-4-2-0-8的顺序,可以看到:最大的数8已经沉底,成为最下面的一个数,而小的数上升。经过第一轮(5次比较)后,得到了最大的数8。
如果有n个数,则需要比较n-1轮,在第一轮需要进行n-1次两两比较,在第j轮中要进行n-j次的两两比较。
这种如水底的气泡逐步冒出水面一样,故称之为冒泡法。
打擂台方法:
解题思路:先思考一下在打擂台的时候怎样确定最后的优胜者。先找出任一个人站在台上,第2个人上去与之比武,胜者留在台上。再上去第3个人,与台上的人比武,胜者留在台上,败者下台。以后每一个人都和当时留在台上的人比武。直到所有人都上台比过为止,最后留在台上的就是冠军,这中方法就是打擂台法。
我们本题目也采用打擂台算法。先让a[0][0]做“擂主”,把它的值赋给变量max,max用来存放当前已知的最大值,在开始时还未进行比较,把最前面的元素认为是当前最大值,然后让下一个元素 a[0][1]和max比较,如果a[0][1]>max,则把 a[0][1]赋值给max,取代 max的原值。以后以此处理,直到全部比完之后,max就是最大值。
字符数组的定义
定义字符数组的方法与定义数值型数组的方法类似:例如∶char c[10];就定义了为字符数组,包含10个元素。
字符串外部输入读取
字符串函数的头文件 #include<string.h>
scanf(“%s”,s);把\n和空格作为空白,当分隔符处理,不作为字符串内容