01A01.C Primer Plus - 初识C语言

C语言的诞生和发展

1972年诞生于贝尔实验室

1972年贝尔实验室的Dennis Ritch和Ken Thompson在开发UNIX操作系统时设计了C语言。是在B语言的基础上进行设计。

C语言的标准化过程-ANSI/ISO标准、C99、C11标准、C17标准

1978年,Brian Kernighan和Dennis Ritchie合著 The C Programming Language第一版。

1983年美国国家标准协会ASNI组件了X3J11委员会。

1989年公布了ASNI C标准,定义了C语言和C标准库。——信任程序员;保持语言精炼简单;只提供一种方法执行一种操作;让程序更快。

1994年,ASNI/ISO联合委员会修订C标准,1999年发布C99标准。——支持国际化编程;调整现有实践致力于解决明显的缺陷;使用科学和工程项目中的关键数值计算

2007年,C语言标准委员会修订C语言,2011年发布C11标准。——加入字节对齐说明符,泛型机制,对多线程支持,静态断言,原子操作,支持Unicode。

2018年,发布C17标准,对C11进行了补充和修正。没有新特性。

预计2022年发布C2X标准

C语言的基本特性

设计特性

C语言的设计理念让用户能秦松地完成自顶向下的规划。结构化编程和模块化设计。

高效性

C程序相对更紧凑,运行速度很快。具有通常汇编语言才具有的微调控制能力,可以根据具体情况微调程序以获得最大运行速度或最有效地使用内存。

可移植性

C是可移植的语言。在一种系统中编写的C程序稍作修改就能在其他系统运行。但程序中针对特殊硬件设备或操作系统特殊功能编写的部分,通常是不可移植的。

强大而灵活

C语言功能强大而灵活。强大是指用途范围广,灵活是指同一个功能可以有许多种实现方法。

面向程序员

C语言是为了满足程序员需求设计的,程序员可以利用C访问内存中的位。有丰富的运算符,能让程序员表达自己的意图。

程序设计语言的分类

机器语言

机器语言是一种计算机能够直接识别和运行的二进制数字指令系统。

计算机能够识别和运行与计算机软硬件平台对应的机器语言,并不能直接识别高级程序设计语言的指令和代码。高级程序设计语言需要通过相应的编译器软件进行编译。

汇编语言

高级程序设计语言

C语言的编程机制

机器语言代码和C语言源代码的关系

C语言编写程序是,编写的内容被存储在文本文件中,该文件被称为源代码;源代码经过编译和链接转换成可执行文件。

C语言源代码经过编译转化成机器语言代码。

C语言源文件的编译

首先将源代码编译成目标代码,目标代码链接组合成可执行程序。

目标代码文件和系统库

目标大妈不是一个完整的可执行文件,其中还缺少库代码和启动代码。

可执行代码(机器语言指令)

对应计算机能识别并执行指令的代码。

应用C开发的基本过程

分析阶段——定义程序目标、设计程序

定义程序目标是指分析实现该目标的基本方法。思考程序需要哪些信息,需要哪些控制和计算,程序需要返回什么信息。

设计程序是指完成目标分析之后进行进一步的细化工作。考虑如何用程序来完成目标,用户界面什么样,如何组织程序,目标用户是谁,工作周期多长。

编码阶段——编写代码、编译、运行程序

编写代码,按照C语言的语法规则进行代码的编写。使用文本编辑器存储源代码。编写过程中要添加文字注释。

编译,调用编译器将C语言的源代码文件编译成可执行程序。编译的细节取决于编程的环境。

运行程序,检测城市是否能够在目标系统上正确运行。

测试和维护阶段——测试和调试程序、维护和修改程序

测试和调试程序。检测程序是否能够获得正常的运算结果。

维护和修改程序,修正代码错误,增强可读性,添加注释,描述设计思路等。

C语言的编译器

Windows系统——MinGW、MS VC

Macintosh(Mac)——LLVM

Linux——GCC

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. CRC-16的C语言实现: ``` #include <stdio.h> #include <stdint.h> #define POLY 0x8005 #define INIT 0xffff uint16_t crc16(uint8_t *data, uint16_t length) { uint16_t crc = INIT; uint16_t i, j; for (i = 0; i < length; i++) { crc ^= (uint16_t)data[i]; for (j = 0; j < 8; j++) { if (crc & 0x0001) { crc = (crc >> 1) ^ POLY; } else { crc = crc >> 1; } } } return crc; } int main(void) { uint8_t data[] = {0x01, 0x02, 0x03, 0x04}; uint16_t crc = crc16(data, sizeof(data)); printf("CRC-16: 0x%04x\n", crc); return 0; } ``` 2. 实现过程: - 读取输入文件,逐行读取每个数据流。 - 对每个数据流进行CRC-16校验,将校验码写入输出文件。 - 输出文件的格式为:输入数据流、校验码,每个数据流和校验码占用2个字节,使用小端格式。 示例代码: ``` #include <stdio.h> #include <stdint.h> #include <stdlib.h> #define POLY 0x8005 #define INIT 0xffff uint16_t crc16(uint8_t *data, uint16_t length) { uint16_t crc = INIT; uint16_t i, j; for (i = 0; i < length; i++) { crc ^= (uint16_t)data[i]; for (j = 0; j < 8; j++) { if (crc & 0x0001) { crc = (crc >> 1) ^ POLY; } else { crc = crc >> 1; } } } return crc; } int main(void) { FILE *fin, *fout; uint8_t *data; uint16_t crc; uint32_t filesize, i; // 打开输入文件 fin = fopen("input.txt", "rb"); if (fin == NULL) { printf("Can't open input file.\n"); return -1; } // 打开输出文件 fout = fopen("output.txt", "wb"); if (fout == NULL) { printf("Can't open output file.\n"); fclose(fin); return -1; } // 获取输入文件大小 fseek(fin, 0, SEEK_END); filesize = ftell(fin); fseek(fin, 0, SEEK_SET); // 分配内存 data = malloc(filesize); if (data == NULL) { printf("Can't allocate memory.\n"); fclose(fin); fclose(fout); return -1; } // 读取数据流并计算CRC-16校验码 while (fread(data, 1, 2, fin) != 0) { crc = crc16(data, 2); fwrite(data, 1, 2, fout); fwrite(&crc, 1, 2, fout); } // 释放内存 free(data); // 关闭文件 fclose(fin); fclose(fout); return 0; } ``` 3. 程序流程图如下: ``` start -> open input file -> check if successful -> open output file -> check if successful -> get file size -> allocate memory -> read data stream from input file -> calculate CRC-16 checksum -> write data stream to output file -> write checksum to output file -> repeat until end of file -> free memory -> close input file -> close output file -> end ``` 4. 0x00-0xff的CRC校验码表: ``` const uint16_t crc16_table[256] = { 0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011, 0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022, 0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072, 0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041, 0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2, 0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1, 0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1, 0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082, 0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192, 0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1, 0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1, 0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2, 0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151, 0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162, 0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132, 0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101, 0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312, 0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321, 0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371, 0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342, 0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1, 0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2, 0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2, 0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381, 0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291, 0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2, 0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2, 0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1, 0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252, 0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261, 0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231, 0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202 }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值