之前总结了引言和第一章,回想起了好多重要的知识点,之前不太理解的概念也清晰多了。
第二章 类型、预算副与表达式
划线重点:
1,在传统c语言用法中,变量名使用小写字母,符号常量名全部使用大写字母。
2,Int通常反映了所用机器中整数的最自然长度。
3,0XFUL是一个unsigned long类型的常量
4,字符常量’\0’表示值为0的字符,也就是空字符(null)。我们通常用’\0’的形式代替0,以强调某些表达式的字符属性,但其数字值为0。
5,存储字符串的物理存储单元书比扩在双引号中的字符数多一个。
6,标准库函数strlen(s)可以返回字符串参数s的长度,但长度不包括末尾的’\0’。标准头文件
7,在没有显示说明的情况下,enum类型的第一个枚举名的值为0,第二个为1。
8,自动转换是指把比较窄的操作数转换为比较宽的操作数,并且不丢失信息的转换。
9,标准头文件
10,强制类型转换只是生成了一个指定类型的值,原变量本身不改变。
11,自增预算符在不需要使用任何具体值且仅需要递增变量的情况下,前缀方式和后缀方式的效果相同。
例程:
2.3常量
//strlen函数:返回字符串s的长度
int strlen(char s[])
{
int i;
i=0;
while(s[i] != '\0') i++;
return i;
}
2.7类型转换
//atoi函数:将字符串s转换为相应的整形数
int atoi(char s[])
{
int i,n;
n = 0;
for(i = 0;s[i] >= '0'&&s[i] <='9';i++)
n = n*10 + (s[i]-'0');
return n;
}
//lower函数:把字符c转换为小写形式,只对ASCII字符集有效
int lower(int c)
{
if(c >= 'A' &&c <= 'Z')
return c+'a'-'A';
else
return c;
}
//squezze函数:从字符串s中删除字符c
void mysqueeze(char s[],int c)
{
int i,j;
for(i = j = 0;s[i] != '\0';i++)
if(s[i] !=c)
s[j++] = s[i];
s[j] = '\0';
}
第三章 控制流
从这章开始有些比较复杂涉及到算法,或者字符串处理的函数就先略过,时间有点紧,这些放到学习离散数学和数据结构的时候再总结。
划线重点:
1,strlen函数返回字符串的长度。
例程:
3.8折半查找法
该函数用于判定以排序的数组v中是否存在某个特定的值下。数组v的元素必须以升序排列。如果v中包含下,则该函数返回x在v中的位置,否则返回-1。
//binsearch函数:在v中查找x
int binsearch(int x,int v[],int n)
{
int low,high,mid;
low = 0;
high = n-1;
while(low <= high)
{
mid =(high + low)/2;
if(x < v[mid])
high = mid -1;
else if(x > v[mid])
low = mid +1;
else
return mid;
}
return -1;
}
我们来分析一下这个函数的逻辑
(1)v长度为0,空数组
Low=0,high=-1,while false,return -1;
(2)v长度为1
Low=0,high=0,while true,mid=v[0]
若x!=v[0],return -1
(3)v长度>=2
两种情况,low+1=mid=high-1时
如果x!=v[mid],无论大小,low/high = mid
变成low=mid=high-1
若x>v[mid],low+1==high,mid == high == low,return.
若x
若此时依然找不到x,无论大小,都会low>high,return -1。
总结,无论数组数量多少,逼近的过程中,会出现low+1==mid==high-1,low==mid==high-1,low==mid==high这个过程,没有怀疑中的那种因为(low+high)/2会跳过某些数的问题。
第四章 函数与程序结构
划线重点:
1,C语言程序一般都由许多的小函数组成,而不是由少量的较大的函数组成。
2,在不同的系统中,保存再多个源文件中的c语言程序的编译与加载机制是不同的。
3,Atof是atoi函数的扩展,在标准库中,
4,C语言不允许在一个函数中定义其他函数,因此函数本身是外部的。
5,如果两个函数必须共享某些数据,而这两个函数互不调用对方,这种情况下最方便的方式是吧这些共享数据定义为外部变量,而不是作为函数参数传递。
6,如果变量定义在任何函数的外部,则是外部变量。因此,我们把push和pop函数必须共享的栈和栈顶指针定义在这两个函数的外部。
7,#define的范围是从符号开始到文件结尾。
8,在函数开头声明的自动变量来说,作用域是声明该变量名的函数。外部变量或函数的作用域从声明它的地方开始,到期所在的文件末尾。
9,一个源程序的所有源文件中,一个外部变量只能在某个文件中定义一次,而其他文件可以通过extern声明来访问它。外部变量的定义中必须指定数组长度,但extern声明不一定要指定数组长度。
10,外部变量的初始化只能出现在其定义中。
11,#ifdef与#ifndef用来测试某个名字是否已经定义。
例程:
4.1将输入中包含特定模式或字符串的各行打印出来
#include
#define MAXLINE 1000 //最大输入长度
int mygetline(char line[],int max);
int strindex(char source[],char searchfor[]);
char pattern[] = "ould";
//找出所有与模式匹配的行
int main()
{
char line[MAXLINE];
int found = 0;
while(mygetline(line,MAXLINE) > 0)
if(strindex(line,pattern) >= 0)
{
printf("%s",line);
found++;
}
return found;
}
//mygetline函数:将行保存在s中,并返回长度
int mygetline(char s[],int lim)
{
int c,i;
i = 0;
while(--lim>0 && (c = getchar()) != EOF && c!= '\n')
s[i++] = c;
if(c == '\n')
s[i++] = '\n';
s[i] = '\0';
return i;
}
//strindex函数:返回t在s中的位置,未找到返回-1
int strindex(char s[],char t[])
{
int i,j,k;
for(i = 0;s[i] != '\0';i++)
{
for(j = i,k = 0;t[k] != '\0' && s[j] == t[k];j++,k++);
if(k > 0 && t[k] == '\0')
return i;
}
return -1;
}
4.3外部变量
栈
#include
int main()
{
return 0;
}
#define MAXVAL 100 //栈的最大深度
int sp = 0;
double val[MAXVAL];
//push函数:将f压入到值栈中
void push(double f)
{
if(sp < MAXVAL)
val[sp++] = f;
else
printf("error:stack full,can't push %g",f);
}
//pop函数:弹出并返回栈顶的值
double pop(void)
{
if(sp > 0)
return val[--sp];
else
{
printf("error:stack empty\n");
return 0.0;
}
}