c语言学习总结-2

之前总结了引言和第一章,回想起了好多重要的知识点,之前不太理解的概念也清晰多了。
第二章 类型、预算副与表达式
划线重点:
1,在传统c语言用法中,变量名使用小写字母,符号常量名全部使用大写字母。
2,Int通常反映了所用机器中整数的最自然长度。
3,0XFUL是一个unsigned long类型的常量
4,字符常量’\0’表示值为0的字符,也就是空字符(null)。我们通常用’\0’的形式代替0,以强调某些表达式的字符属性,但其数字值为0。
5,存储字符串的物理存储单元书比扩在双引号中的字符数多一个。
6,标准库函数strlen(s)可以返回字符串参数s的长度,但长度不包括末尾的’\0’。标准头文件声明了strlen和其他字符串函数。
7,在没有显示说明的情况下,enum类型的第一个枚举名的值为0,第二个为1。
8,自动转换是指把比较窄的操作数转换为比较宽的操作数,并且不丢失信息的转换。
9,标准头文件中定义了一组与字符集无关的测试和转换函数。如tolower(c)将c转换为小写形式,isdigit(c)判断是否为数字。
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 变成low=mid=high
若此时依然找不到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;
        }
}

 

 

 

 

 

你可能感兴趣的:(学科总结)