zoukankan      html  css  js  c++  java
  • 开端C程序设计 略看

     谭浩强著,c语言程序设计第二版,,大概地翻了翻--纪念下
    第一章 c语言概述
    1。 C语言是在B语言的基础上发展而来,1975年unix第六版发布后,C语言才引起人们普片注意.
    2。 C语言特点:语言简洁,紧凑,使用方便;运算符多;数据结构丰富;具有结构化的控制语句;语法限制不太严格;能进行位(bit)操作,实现汇编语言的大部分功能,能直接对硬件进行操作;生成目标代码质量高,执行效率高;可移植性好(与汇编相比);
    3。 简单介绍:C程序是由函数构成,都必须有一个main函数,作为入口,函数由首部[函数类型函数名,参数类型,参数名]和函数体[声明部分,执行部分]组成 ;;语句由分号(;)分割;用/* ----- */进行注释
    4。 运行步骤:输入源程序->编译->与库函数链接->运行可执行目标程序 (.C  --> .obj --> .exe)
     
    第二章 程序的灵魂--算法
    1. 程序包含对数据的描述[数据结构]和对操作的描述[算法]....程序 = 算法 +数据结构 + 程序设计方法 + 语言工具和环境
    2。 广义的说为解决问题而采用的方法和步骤即称为算法,..主要讲计算机能执行的算法(如给我理发就不能).分 数值[求数值解]和非数值算法[事务领域如检索管理调度等]
    3 . 举例:如判断瑞年,求平均数,判断素数,求有规律的加减乘除运算等
    4 .算法特点:有穷性,确定性,有零个或多个输入,有一个或多个输出,有效性,
    5,.算法的表示:自然语言(如汉语,英语等),用流程图表示(用一些图框表示)(BS传统流程图,N-S结构化的流程图大框里面含小框[包括顺序,选择和循环结构框]
    伪代码表示(中英文混合,把意思表达清楚即可).用计算机语言表示(与c,语言,java语言等)
    6。结构化程序设计:自顶向下,逐步细化,模块化设计,结构化编码

     
    第三章 数据类型,运算符,表达式
    1。数据类型:基本类型[整型,字符型,浮点型(单精度和双精度),枚举型],构造类型[数组,结构体,共用体],指针类型,空类型(void)
    2. 常量和变量;程序运行过程中,其值不能被改变的量称为常量,一般从字面意思即可判断,可用一个标示符代表一个常量,用#define定义,如#define PRICE 30 则出现PRICE的地方用30代替,不能再给PRICE赋值,改变时,'一改全改'
       变量:其值可以改变的量称为变量,应该由一个名字在内存中占据一定的存储的单元.变量名实际上是一个符号地址,在编译时由系统分配内存地址,程序通过变量名找到对应的内存地址,从存储单元取值---变量要求先定义后使用
    3。整形数据 :十进制,八进制 (以0开头如0123等于83, -011等于-9) 十六进制(以0x开头,如0x123等于291,0x12等于-18
       存放方式,2个字节16位,2的16次方,若有符号则取以为表示符号,
    4。 实型(浮点型)--十进制形式或指数形式如1.23e3;  float占四个字节.double 占8位,long double 占16位,分数符,指数部分,小数部分
    5 .字符型数据;以单引号引起来,如'a' ..  '\'为转义字符,如\n表示换行,\\指\..\'指' ;;只能存放一个字符,将该字符对应的ASCII码,放到存储单元中.
    6。 算术运算法:算术,关系,逻辑,位,赋值,条件,逗号,指针,下标等
    7。赋值运算符 =号,类型转换


    第四章 顺序程序设计
    1。c语句分类:控制语句[if else,for while continue,break,return等],函数调用语句,表达式语句(运算,赋值等),空语句,用{}括起来的符合语句
    2。数据的输入输出.如printf,scanf不是C语言文本中的组成部分,是c提供的函数以库的形式放于系统中,使用时要用预编译命令#include 添加头文件,如#include"studio.h"
    3. 字符输入,输出char c ;putchar(c),c= getchar();格式化输入输出printf(格式控制,输出列表)如printf("%d,%c\n",i,c).
    4。 格式字符:d格式符,输出十进制整数,%d,%md(m表示输出宽度),%ld(输出长整型
                 o格式,以八进制形式输出整数
                 u格式,输出unsigned型整数,
                 c格式,,输出一个字符
                 s格式,输出一个字符串,%s,%ms,%-md,%m.nd---
                 f格式,e格式,g格式
                 想输出%,用2个百分号如 printf("%f%f%",1.0/3)--输出 0.33333%
    5.scanf 格式输入函数
    6。顺序结构设计举例

    第五章 选接结构程序设计
    1。 if (关系表达式) 语句1 else 语句2
    2。 &&逻辑与, ||逻辑或,!逻辑非
    3。 switch语句.注意添加break;

    第六章 循环控制
    1.goto语句
    2。while语句
    3。do-while语句
    4。for语句
    5。循环的嵌套,
    6。break 语句,continue语句


    第七章 数组
    1。一维数组定义:  类型说明符 数组名[常量表达式] 如int a[10]
    2.一维数组引用:  数组名[下标] 如 a[0] --- a[9]
    3 一维数组初始化: (1)可在定义时赋值如 int a[5]={0,1,2,3,4} (2)只给一部分赋值如 int a[5] = {0,1,2,3} 只给前几位赋值 (3)全部赋值0可写成 int a[5]={0}
                      (4)在对全部元素赋处值时,可以不指定数组长度,如int a[]={0,1,2,3,4}a
    4.二维数组 定义与引用
       (1)定义: 类型说明符 数组名[常量表达式][常量表达式] 如 int a[3][4] 定义了3行四列的数组
       (2)引用: 数组名[下标][下标]
       (3)赋值 a : 如 int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}
    5,字符数组
       (1)定义:如 char c[10] (2)引用, (3)初始化都类似
       (4)字符串和字符串结束标志:C语言中将字符串作为字符数组来处理,系统对字符串常量自动加一个'\0'做为结束符
      (5)字符串处理函数:puts(字符数组) , gets(字符数组) , strcat(字符数组1,字符数组2) , strcpy(数组一,数组二),strcmp(字符串1,字符串2)
         strlen(字符数组)测试实际字符串长度,不包括'\0\ strlwr(字符串) , strupr(字符串)分别是 string to lowercase ,string to uppercase

    第八章 函数
    1。概述 :一个源程序文件由一个或多个函数组成,源程序文件是编译单位,而不是以函数为单位进行编译;;一个c程序由一个多多个源程序文件组成
            c程序从main函数开始,在main函数中结束,函数都是平行的;;用户角度分 标准函数(库函数),自定义函数;;从形式有参和无参
    2。定义的形式: 类型标示符 函数名([形参列表]) {声明部分,语句; }

    3。形参实参.定义时用的是形参,调用时赋值的是实参
    4。返回值:通过return 语句获得
    5。函数调用
    6。函数嵌套
    7 函数递归
    8。数组作为参数传递
    9。局部变量,全局变量
    10。变量的存储类别:静态存储(程序运行时,分配固定的存储空间,动态存储(运行期间根据动态需要分配)
    auto.static,register变量
    11。用extern声明外部变量;;;在一个文件内部声明外部变量,在多文件程序中声明外部变量
    12,用static声明外部变量
    13。内部函数 外部函数
    14。如何运行一个多文件的程序.:建立项目文件,用include命令
    第九章 预处理命令
    1。宏定义 #define 标示符 字符串
    2。文件包含#include <文件名>
    3。条件编译 #ifdef 标识符
                            程序段
                #else
                    程序段
                #endif

    第十章 指针
    1。 想着挺清,可写不出来,,,
    内存中每个字节都有一个编号,程序中通过变量名对变量进行操作,而实际上经过编译以后已将变量名转换为了变量的地址,是通过地址进行读取操作,
    用一个变量专门来存放另一个变量的地址,称为指针变量---这样操作指针即相当于操作变量
    2。定义变量指针.. 基类型 * 指针变量名 .如int *p
    3, 指针变量的引用:*指针运算符, &取地址运算符
    4。.指针作为函数参数传递,在内部改变的是实参的值
    5。 数组与指针y
    指向数组元素的指针,如int a[10] ;int *p ;p = &a[0] .则p是a[0]元素的地址
    6。通过指针引用数组元素m..  假设上面p指向数组a的第一个元素,则p+1指向a数组的下一个元素
    7..用函数名作函数参数
    8。多维数组与指针
    9字符串与指针
    -------------
    借用网上的:
    (1).指针的加减法:指针的加减法不是作简单的加减,而是以指针变量所占的字节数为单位进行加减.
    (2).数组名是指针常量,不能改变其值,比如数组a[ ],如果进行a++;就会报错
    (3). 虽然指针变量中存放的地址是整型数据,但不能将整型数据直接赋值给指针变量,应该这样(假如p为int *型),p=(int *)1000;但禁用些法,因为你不知道1000这个单元有没有被其它单元占用,后果不可预料,同样也不能将一个指针变量的值直接赋给整形变量,也要进行强制类型转换.
    (4)定义指针后,在使用之前一定要先给它赋初值,切记
    (5).二维数组中指针问题(int a[3] [4]),数组名a是一个指向行的指针(指向数组),而在其前面加一个 * ,*a就是指向列的指针(指向无素).a与*都是指向a[0][0];但a+1(行指针)指向a[1][0];而*a+1(列指针,和*(a+0)+1一样)却指向a[0][1];同样在a+1前加一个*就又变成列指针了,*(a+1)+2就指向a[1][2].
    (6),复杂类型的说明:从变量名处起,根据运算符优先级结合,一步一步分析,下面以一个比较复杂的类型(int * (*p(int))[ ])为例:
    第一步,p先与()结合,说明是一个函数,第二步,()内有一个int,说明函数有一个形参为int型,第三步与*结合,说明返回的是一个指针变量,第四步与[ ]结合,说明该指针变量指向数组,第五步再与*结合,说明数组中的元素为指针型,第六步说明数组中的指针元素的类型为int型,完毕,所以这是一个返回一个由整型指针变量组成的数组的指针变量的函数.

    -------------
    第十一章 结构体,共用体
    1。定义结构体变量,变量的引用,初始化,结构体数组
    2。指向结构体类型的指针
    3,用指针处理链表,链表的操作
    4。枚举类型
    5。typeof定义类型

    第十二章 位运算
    1。位运算指进行二进制的运算,
    2。包括: & 按位与, ~取反, |按位或, << 左移, ^按位异或, >> 右移 --- 除~取反外都是二目运算符


    第十三章 文件
    1。操作系统以文件为单位进行管理的;;;;;;;C 语言把文件看做一个字符(字节)徐磊..根据数据的组织形式,分 ASCII 文件和二进制文件.
    C语言中对文件的操作是通过库函数完成的.
    2。文件类型指针:定义了一个文件的结构,typedef struct {short level;unsigne flag ;等略} FILE ;-->可定义一二FILE数组 FILE f[5] -->可存放多个文件信息-->定义文件类型指针FILE * fp,可使fp指向
    某一个文件的结构体变量,从而访问该文件
    3。文件的打开,关闭 fopen 函数 返回一个文件型指针, FILE * fp = fopen(文件名,打开方式) 打开方式[r读,w写,a追加,b二进制]: r,w,a ,rb,wb,ab,
     r+ 读写,必须已存在,w+读写建立一个新文件,原来若有被删除,a+为读写打开一个文本,若有则追加. 关闭用fclose(fp);

    4。文件读写:::fputc函数,fgetc函数, putc ,getc,fread,fwrite,fprintf,fscanf,getw,fgets,fputs,putw
    5.文件定位:rewind(重新定位于文件开头) fseek(文件指针,位移量,起始点). ftell(fp) 获取流式文件当前位置
    6,出错检测 ferror函数, ferror(fp)返回0 未出错, clearerr函数,使文件错误标志和结束标志为零

    十四章(C++对C的扩充)
    1。添加了//形式的注释
    2。输入输出用cin>> cout<<
    3.  C++ --.cpp C plus plus
    4。 重载(函数参数个数,类型以及返回类型 都可不同)同名函数不同功能.
    5。 函数(带缺省参数的,放在最右端,如void 飞(int a,int b,int c=10);
    6。  .引用(C++中新的变量类型,-为一个变量起一个别名-如int a;int& b = a;声明引用不另辟内存单元,代表同一变量,一个变另一个也一起做相应变化
    函数参数传递方式
    (1)传给形参变量的值,如void swap(int a,int b)--int i=3,j=5;swap(i,j)--在swap内进行了交互但i,j值没变
    (2)传给形参变量的指针,如void swap(int *a,int *b)--int i=3.j=5;swap(&i,&j)--在swap内操作的是(int 型的)*a和*b(是地址).i,j的值改变了
    (3)C++添加的,传给形参变量的别名:如void swap(int & a,int &b)--int i =3,j=5; swap(i,j)--在swap内操作的是(int &型的)a,b(是别名),i,j的值随着改变
    7. 内置函数,在函数名前加inline ,如inline int max(int a,int b).相当于把改函数加到调用它的地方作为一个程序段,节省运行时间,和宏替换类似,不完全相同,宏是在编译前由预处理程序处理,自作简单字符替换,不做语法检查,而内置式在编译时处理,进行语法检查
    8.作用域运算符, ::a标示全局作用域中的变量a;
    9.new/delete 动态分配撤销内存

    十五章(C++面向对象基础)
    1。客观世界任何事物都可看做对象.具有属性和行为...对象的类型--C++中称为类.类是对象的抽象,对象是类的实体
    2。用关键字class 定义类(类似int定义整数)--用"."操作符指明该类的那些属性或方法
    3。建立一个对象时,会有默认的构造函数和析构函数用来进行初始化和释放资源--均可重载,没有返回值,名字与类名相同,析构前加~
    4.继承和派生;继承机制,在一个已存在的类上建立一个新类,基类(父类)--子类(派生类).子类具有父类所有的数据和函数成员,并增加了新的成员;; 用:来继承
    如class a: public b
    5.定义派生类(子类)形式:  class 子类名 :[引用权限] 父类名 {新成员; };
    引用权限默认是private;还有public ---对于内部定义成员的访问权,就是在原有权限基础上加上派生类定义的权限,取最小权限;;;;如父类public,若继承时用private则在子类中,成为private,若父类private,子类中无论如何继承均为private
    6..基类的构造函数不会被继承,在执行派生类的构造函数时,应调用基类的构造函数
    如 a(int a,int b,int c):b(a,b){---};其中a继承自b,
    7.在建立对象时,先调用基类的构造函数再调用子类的,在析构时,先析构子类,再析构父类
    8。继承的重大意义::不说了,偷懒?

    十六章:常见的错误和程序调试
    --

     

     1。想看编译原理啦:: 先预处理---编译---连接---执行
    2.宏定义 #define 标识符 字符串  三种预处理之一,是编译之前的处理[替换],不做语法检查,结尾没有分号,可嵌套使用,通常在开头,可使用#undef命令终止宏定义作用域
          可带参数,#define 宏名(参数表) 字符串  如 #define S(a,b) a*b
      在头文件中被大量使用
    #define _tstring std::string
    #define _tmain main
    #define _tostream ostream
    #define _tcout cout
    #define _tsprintf sprintf
      提高程序的通用性和易读性,便于修改,主要就是替换
    3。条件编译.希望一部分内容再满足一定条件才进行编译,则指定编译条件,既是条件编译.
    形式如下  #if NNN   statement1;   #elif MMM   statement2;   #else   statement3;   #endif
    #if 与 #endif一定是成对出现的, 
    如(1)
    #ifndef BM2_H
    #define BM2_H
    #endif 
    如果没有定义BM2_H ,则定义BM2_H
     (2)#ifdef BM2_USES_WCHAR
    #define _tstring std::wstring
    #else
    #define _tstring std::string
    #endif
      如果定义过BM2_USES_WCHAR 则宏定义std::wstring 为_tstring.否则定义std::string为_tstring [即在处理时,把程序中的字符_tstring替换为std::string还是std::wstring]
     
     4. #pragma 预处理指令:它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作
     如#pragma once   这是一个比较常用的指令,只要在头文件的最开始加入这条指令就能够保证头文件被编译一次   
     #pragma once用来防止某个头文件被多次include,#ifndef,#define,#endif用来防止某个宏被多次定义。
     如:
    #if !defined (BM2_LACKS_PRAGMA_ONCE)
    # pragma once
    #endif
    如果没有定义BM2_LACKS_PRAGMA_ONCE,则执行# pragma once.保证其所在的头文件(.h文件)只被编译一次
     5。#typedef 为现有类型创建一个新的名字,
     如:
     #ifndef EP_MSG_QUE
      typedef struct msg_queue {
       long mtype;
       char text[MAX_LEN];
      } MSG_QUE;
      #define EP_MSG_QUE
    #endif
     如果没有定义EP_MSG_QUE,则定义一个结构msg_queue,并为其创建一个新的名字MSG_QUE.则程序中即可用MSG_QUE表示msg_queue结构体,如定义MSQ_QUE temp;定义一个msg_queue结构体temp
     
     6 .名称空间的使用,using namespace BM2;using namespace BM2::Data::DbClient;
     

  • 相关阅读:
    MySQL 抓包工具
    php安全配置记录和常见错误梳理
    Mongodb副本集+分片集群环境部署记录
    线上mongodb 数据库用户到期时间修改的操作记录
    Redis+TwemProxy(nutcracker)集群方案部署记录
    Linux下Redis主从复制以及SSDB主主复制环境部署记录
    以多个实例方式打开Notepad++
    什么才是程序员的核心竞争力?zz
    谈谈如何在面试中发掘程序猿的核心竞争力zz
    解决Android SDK Manager更新时出现问题
  • 原文地址:https://www.cnblogs.com/9421/p/1759272.html
Copyright © 2011-2022 走看看