《C程序设计(第四版)》学习笔记

参考教材:谭浩强的《C程序设计(第四版)》

序——对好书的定义:(20130106)

1、定位准确。要明确读者对象,要有的放矢,不要不问对象,提笔就写。

2、内容先进。要能反映计算机科学技术的新成果、新趋势。

3、取舍合理。要做到“该有的有,不该有的没有”,不要包罗万象、贪多求全,不应把教材写成手册。

4、体系的当。要针对非计算机专业学生的特点,精心设计教材体系,不仅使教材体现科学性和先进性,还要注意循序渐进、降低台阶、分散难点,使学生易于理解。

5、风格鲜明。要用通俗易懂的方法和语言叙述复杂的概念。善于运用形象思维,深入浅出,引人入胜。

 

前言——作者对程序设计的看法:

1、为什么要学习程序设计

计算机能高效处理各科学领域中可用逻辑分解成一定步骤的问题,程序则是操作计算机运行的主要手段,因此,对于专业人员,学好程序设计的必要性无需多言,而对于非专业人员,为了能更好的描述问题、同专业人员沟通,掌握程序设计的入门知识也是有其必要的。

2、为什么选择C语言

C虽然略显古老,但相比C++,C易学,毕竟不是所有人需要用C++编写大型程序的,再者,C更接近机器,让我们了解机器工作原理,就像一个医生不懂最基本的解剖学就在开处方。可参考《给计算机系学生的建议》

3、怎样组织程序设计的教学?怎样处理算法和语言的关系

进行程序设计,要解决两个问题:1)学习算法(算法是灵魂、语言是工具)。2)掌握用以实现算法的程序语言。两者缺一不可、相辅相成、随着篇幅增加而提高难度。

 

第1章 程序设计和C语言

1.1 什么事计算机程序

计算机并非“万能”,它只能根据我们事先写好的程序行动。

程序是一组计算机能识别和执行的指令。

计算机本质是程序机器。

1.2 什么是计算机语言

人与人沟通通过人类的语言,人与计算机沟通通过计算机语言。

Machine Language经历了几个发展阶段:

1)machine instrction(1&0构成的机器指令),缺点:难学、难写、难记、难改、难用。

2)symbolic language(又称assembler language由诸如ADD、SUB等助记符构成),缺点:在不同型号的计算机上没有兼容性,且仍然难学,只有专业人士能用。

3)high language(source program通过编译转换为object program,再通过连接转为execution program)克服了跨计算机的兼容性和难学。诸如:fortran&algol(适合数值计算)、basic&gbasic(适合初学者的小型会话语言)、cobol(适合商业管理)、pascal(适合教学的结构程序设计语言)、PL/1(大型通用语言)、LISP&PROLOG(人工智能)、C(系统描述语言)、C++(支持OOP的大型语言)、Visual Basic(支持OOP的语言)、Java(适合网络)。

其中,High language是目前计算机行业所使用的主要语言,又经历了以下阶段:

1)非结构化(无严格规范、流程可随意跳转,代码难以阅读&维护)。

2)结构化(解决了上述问题,但难以应付大型程序)。

3)面向对象(专门处理规模较大的问题)。

1.3 C语言的发展及其特点

1967年,C语言的祖先BCPL语言诞生(英国剑桥大学——Martin Richards推出),无数据类型。

1970年,B语言诞生(美国AT&T贝尔实验室——Ken Thompson),过于简单、功能有限。

1972~1973年,结合了BCPL和B语言的特点,C语言诞生(美国AT&T贝尔实验室——D.M.Ritchie)。

1973年,Ken Thompson&Ken Thompson合作用C重写了90%的UNIX(Version5)。

1978年,Brian W.Kernighan&Dennis.M.Ritchie以UNIX(Version7)为基础合著了《The C Programming Language》。

1983年,ANSI成立委员会,制定了第一个C语言标准草案('83 ANSI C)。

1988年,Brian W.Kernighan&Dennis.M.Ritchie按照即将公布的ANSI C重修《The C Programming Language》。

1989年,ANSI发布了一个完整的C语言标准——ANSI X3.159-1989(ANSI C/C89)。

1990年,ISO接受C89作为国际标准ISO/IEC9899:1990。

1995年,ISO对C90做了一些修订,命名为ISO/IEC 9899/AMD1:1995。

1999年,ISO在原基础上,对C增加了一些功能,命名为ISO/IEC 9899/AMD1:1999。

2001年&2004年,ISO对C99增加了一些功能,记2001年的TC1和2004年的TC2。

本书以C99为依据。

C语言特点:

1)简洁、紧凑、方便、灵活(一共37个关键字、C是一个很小的内核、不直接提供输入&输出语句和有关文件操作的语句和动态内存管理的语句)。

2)运算符丰富。

3)数据类型丰富。

4)具有结构化的控制语句。

5)语法限制不太严格,程序设计自由度大。

6)允许直接访问物理地址。

7)可移植性良好。

8)生成目标代码质量高,执行效率好。

1.4 最简单的C语言程序

1.4.1 最简单的C语言程序举例

eg1.1要求在屏幕上输出一行信息“This is a program.”

#include <stdio.h>//这是编译预处理命令
int main()//定义主函数
{//函数开始的标志
  printf("This is a C program.\n");//输出所指定的一行信息
  printf("/*This is a multiple common*/\n");//注释会被照常显示
  return 0;//函数执行完毕时返回函数值0
}//函数结束的标志

每个C语言程序都必须有一个main函数,{}内是函数体。

stdio是“standard input&output”的缩写,文件后缀.h的意思是header file。

输入输出函数的相关信息已事先放在stdio.h文件中,#include指令把这些信息调入供使用。

eg1.2求两个整数之和

#include <stdio.h>
int main()
{
  int a,b,sum;
  a=123;
  b=456;
  sum=a+b;
  printf("sum is %d\n",sum);//%d是指定的输出格式,d表示用“十进制整数”形式输出
  return 0;
}

eg1.3求两个整数中的较大者

#include <stdio.h>
int main()
{
  int max(int x,int y);//对被调用函数max的声明
  int a,b,c;
  scanf("%d,%d",&a,&b);//接收2个整形输入值
  c=max(a,b);//调用max函数,将得到的值赋给c
  printf("max=%d\n",c);
  return 0;
}
int max(int x,int y)//定义max函数
{
  int z;
  if(x>y) z=x;
  else z=y;
  return (z);
}

程序的编译是自上而下进行的,max函数的定义在main函数之后,因此,当编译到第8行时,编译系统无法知道max是什么,所以,需要事先声明。

&是”地址符“,&a的含义是”变量a的地址“,执行scanf函数,从键盘读入两个整数,送到变量a、b的地址处,赋值。

1.4.2 C语言程序的结构

1、一个程序由一个或多个源程序文件组成。

1)预处理指令:编译系统在对源程序进行“翻译”前,先由一个“预处理程序”对预处理指令进行预处理,对于#include <stdio.h>就是将stdio文件内容读进来,放在#include处。

2)全局声明:定义函数之前的变量声明,对整个源程序文件范围有效。

3)函数定义:指定函数完成我们想要的功能。

2、函数是C程序的主要组成部分:函数是C的基本单位,设计良好的程序中,每个函数用来实现一个或几个特定的功能。

3、一个函数包括两个部分

1)函数首部:int max(int x,int y)

2)函数体:{ /*声明部分(定义变量or函数声明) block 执行部分*/ }

4、程序总是从main函数开始执行的:无论它是在程序开始,还是结尾部分。

5、程序中对计算机的操作是有函数中的C语句完成的。

6、在每个数据声明和语句的最后必须有一个分号。

7、C语言本身不提供输入输出语句:输入输出操作由库函数scanf&printf等完成。

8、程序应当包含注释。

1.5 运行C程序的步骤与方法

编写源程序==》(.c源文件)==》编译==》(.obj目标文件)==》连接处理==》(.exe可执行文件)==》运行

1.6 程序设计的任务

问题分析==》设计算法==》编写程序==》对源程序进行编辑、编译和连接==》运行程序,分析结果==》编写程序文档

第2章 算法——程序的灵魂

广义角度看,一个程序包括:1、data struction(对数据的描述)。2、algorithm(对操作的描述)。即Data structon+Algorithm=Program。

2.1 什么是算法

不要认为只有“计算”的问题才有算法,广义地说,为解决一个问题而采取的方法和步骤就称为“算法”。

一个问题可以有多个算法,为了有效解题,不仅要保证算法正确,还要考虑算法质量,选择合适的算法。

2.2 简单的算法举例

求1-1/2+1/3-1/4+……+1/99-1/100。

解题思路——表面看,每一项都不一样,但稍加分析,就可以看出:1)第1项的分子分母都是1。2)第2项的分母是2,以后每一项的分母都是前项分母加1。3)第2项前的运算符为减,第3项为加,随后如此循环。

S1: sign=1

S2: sum=1

S3: deno=2

S4: sign=(-1)*sign

S5: term=sign*(1/deno)

S6: sum=sum+term

S7: deno=deno+1

S8: 若deno<=100返回S4;否则算法结束。

#include <stdio.h>
int main()
{
  int sign=1;
  float term,sum=1.0;
  int deno=2;
  for(;deno<=100;deno++)
  {
    sign=(-1)*sign;
    term=(sign*(1.0/deno));//分子使用1.0结果才是浮点型,若使用1结果是整型
    sum+=term;
  }
  printf("sum is %19.18f\n",sum);
  return 0;
}

2.3 算法的特性

1、有穷性。2、确定性。3、有0个或多个输入。4、有1个或多个输出。5、有效性。

2.4 怎样表示一个算法

2.4.1用自然语言表示算法

2.4.2用流程图表示算法

2.4.3三种基本结构和改进的流程图

2.4.4用N-S流程图表示算法

2.4.5用伪代码表示算法

2.4.6用计算机语言表示算法

2.5 结构化程序设计方法

自顶向下,逐步细化,模块化设计(design),结构化编码(coding)。

第3章 最简单的C程序设计——顺序程序设计(20130107)

3.1 顺序程序设计举例

编写C语言程序需要具备的知识和能力:设计算法,算法需要完整、正确,采用结构化程序设计方法。

eg3.1温度转换,用华氏法表示的温度64F,转换为摄氏法表示的温度17.8C。

#include <stdio.h>
int main()
{
  float f,c;
  f=64.0;
  c=(5.0/9)*(f-32);
  printf("f=%f\nc=%f\n",f,c);
  return 0;
}

eg3.2计算存款利息,1000元本金,存一年,有3种方法可选:1)活期,年利率r1。2)定期,年利率r2。3)两次半年定期,年利率r3。

#include <stdio.h>
int main()
{
  float p0=1000,r1=0.0036,r2=0.0225,r3=0.0198,p1,p2,p3;
  p1=p0*(1+r1);
  p2=p0*(1+r2);
  p3=p0*(1+r3/2)*(1+r3/2)
  printf("p1=%f\np2=%f\np3=%f\n",p1,p2,p3);
  return 0;
}

3.2 数据的表现形式及其运算

3.2.1 常量和变量

1、常量:1)整型常量-345。2)实型常量123.456  12.34e3。3)字符常量'A'  '\n'。4)字符串常量"String"。5)符号常量#define PI 3.1416。

2、变量:必须先定义,后使用,由变量名、变量值、存储单元组成。

3、常变量:const int a=3;在变量存在期间其值不能改变。注意:符号常量是预处理指令,预处理编译后符号常量都会被替换为其值,符号常量不占存储单元,而常变量占用存储单元,有变量值,只是该值不能改变。

4、标识符(identifier):对变量、符号常量、函数、数组、类型等命名的有效字符序列统称为identifier。

3.2.2 数据类型

用计算机进行的计算不是抽象的理论值的计算,而是用工程的方法实现的计算,在许多情况下只能得到近似的结果。

基本类型(整型类型(int、short int、long int、long long int、char、bool)、浮点类型(float、double、float_complex、double_complex、long long_comlpex))

scalar type(arithmetic type(基本类型、枚举类型都是数值)、指针类型都是以数字来表示的)

aggregate type(数组类型、结构体类型)

printf中,显示无符号整型用%u、十进制整型用%d、字符用%c。

3.2.3 整型数据

int(2or4)、shor(2)t、long(4)、long long(8)以上默认为signed,可以通过加上unsigned转换为无符号整型。

signed用补码表示复数(正数源码取反+1),由于第一位是符号位,可表示范围比unsigned小一倍。

3.2.4 字符型数据

字符是以整数形式(字符的ASCII代码)存放在内存单元中的。

char(4)也可以用signed(-128~127)、unsigned(0~255)修饰,不同于整型,默认为unsigned。

3.2.5 浮点型数据

float(4)、double(8)、long double(16)没有unsigned之分。

规范化指数形式:

   +   | .314159  |    1

符号 | 小数部分 | 指数

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值