第一章-概述
计算机发展
- 1946年诞生,美国军方用来计算弹道曲线
- 冯·诺依曼提出存储程序的概念
- 指令和数据使用二进制表示
- 指令和数据存储在存储器中
- 计算机由输入设备、输出设备、存储器、运算部件、控制部件五大部分组成
- 有四个时代
- 20世纪50年代 - 真空电子管制造计算机,使用机器语言编写程序,计算机专家手中的工具
- 20世纪50年代末 - 晶体管制造计算机,随着高级预言和系统软件的出现,非计算机专家独用
- 1964年 - IBM推出IBM360系列,使用集成电路技术,在一片硅晶片集成集体管
- 第四代 - 微处理器出现,进入微电子时代
计算机语言
- 机器语言 - 机器可直接执行,占用空间小,执行效率高,不同计算机指令系统不同,机器语言可移植性差
- 汇编语言 - 使用助记符代替机器语言,一定程序上克服机器难以编写和阅读缺点
- 高级预言- 描述算法方便,不依赖于机型,可移植性高,但是效率低下
算法及其描述方法
- 算法 - 解决问题的步骤序列
- 描述方法
- 自然语言
- 传统流程图
- N-S流程图
- 伪代码
- 计算机预言
程序和程序设计方法
- 程序 - 数据结构+算法 【图灵奖获得者- 沃思教授】
- 源程序转换成目标程序需要四个步骤 学习地址
- 预处理
- 编译
- 汇编
- 链接
- 程序设计方法
- 结构化的设计方法 - 三种基本结构
- 顺序结构
- 循环结构
- 选择结构
- 面向对象的设计方法 - 将程序或软件看成一个对象组成的集合
- 结构化的设计方法 - 三种基本结构
第二章-C语言基础
重点
- C语言的字符集、关键字和标识符
- C语言的基本组成
本章知识点
- C语言的发展和特点
- C语言的字符集、关键字和标识符;
- C程序的基本语句分类
- C程序的基本组成
- C程序的开发环境。
掌握C语言的基本组成,了解C语言的运行步骤的调试方法
C语言特点
C语言允许直接对计算机硬件进行曹祖据哦,既具有高级语言的功能,又具有低级语言的功能,所以也被称为“中级语言”,可用来编写系统软件
- 结构化语言
- C语言具有良好的结构化(顺序、选择、循环)语句。
- C语言的函数是程序的基本模块,便于实现程序的模块化
- 运算能力强大:C语言提供三十多种运算符,表达式的种类多样。
- 数据类型丰富:包括整型、实型、字符型、数组型、结构体类型、指针、空类型等。
- 具有预处理能力
- 可移植性好
- 程序执行效率高:由C源程序生成目标代码的效率一般仅比汇编语言低10%~20%
- 程序设计自由度大:C语言的语法限制不严格,允许程序员具有自由度
字符集
C语言的字符集是ASCII
。主要包含下列四类:
- 大小写英文字母A\~Z、a\~z (52个)
- 数字0、1、2、…、9 (10个)
- 非字母、非数字的可现实字符(33个),既键盘可输入的字符,如:+ - “ ~ ( > 等。
- 转义字符
关键字
注意:所有的保留字均有小写字母组成,一旦有一个字母大写,其不再是保留字原来的含义、
数据类型:char
、double
、enum
、float
、int
、long
、shnort
、signed
、struct
、union
、unsigned
、void
控制语句:break
、case
、continue
、default
、do
、else
、for
、goto
、if
、return
、switch
、while
存储类型:auto
、extern
、register
、static
其他关键字:const
、sizeof
、typedef
、volatile
词汇分类
- 常量:C语言运行中其值不发生改变的量。例如-10、12.5等
- 标识符:C程序中使用的变量名、函数名和标号等统称标识符
- 关键字:由C语言规定的具有特定意义的字符串
- 运算符:C语言用于计算的符号,如+ - * \
- 多行注释:
/*注释*/
单行注释://注释
- 分隔符:C语言的分隔符包括括号和空格两种
基础语句分类
-
数据定义语句:用来定义程序中使用的各种能存放数据对象的名称和特性 -
int a,b,c;
-
赋值语句:形如
变量 = 表达式
的语句,功能市计算表达式的值并赋予变量 -a = 2 ; b =3;
-
函数调用语句:形如
函数名(实际参数表)
的语句,功能市调用指定函数 -a = avg*(x,y,z);
-
表达式语句:仅由任何表达式组成的语句 -
c = a+b;
-
流程控制语句:用来控制程序执行过程的语句
- 选择控制语句:
if() ~ else ~
switch
- 循环控制语句:
for() ~
while() ~
do ~ while()
- 中止语句:
break
- 继续循环语句:
continue
- 返回语句: return
- 无条件转移语句: goto
- 选择控制语句:
-
复合语句:用花括号括住的一组任一语句 (埋:复合语句的作用?)(填:判断后需要执行需要多条语句一起执行时,可以使用复合语句)
-
main(){ ..... {......} // 复合语句。 注意:右括号后不需要加; .... }
-
-
空语句:无任何操作的语句,既只由分号组成的语句,一般在程序中用作空循环体。
-
while(getchar() != '\n') ; /* 这里的循环体为空语句,表示循环体什么都不做 注意:while(getchar() != '\n');和上面程序段功能一样 */
-
-
其他语句:包含编译预处理命令、用户自定义类型语句等 -
#include "stdio.h"
普通的C语言例题
- 从键盘输入两个整数,计算其乘积 (主函数实现)
#include <stdio.h> /*编译预处理命令*/
int main(void){ /*主函数*/
int n1, n2, result; /*定义保存两个整数及其乘积的变量*/
printf("please input the two numbers:\n"); //屏幕显示提示信息
scanf("%d,%d", &n1, &n2); //从键盘输入两个整数并分别保存在变量n1和n2
result = n1*n2;
printf("the result is:%d\n", result); //输出变量result中的两个整数的乘积
return 0; //返回
}
/*
please input the two numbers:
2,3
the result is:6
*/
- 从键盘输入两个整数,计算其乘积(多函数实现)
#include <stdio.h>
int mul(n1, n2){
return n1 * n2;
}
void main(void){ /*主函数*/
int n1, n2, result; /*定义保存两个整数及其乘积的变量*/
printf("please input the two numbers:\n"); //屏幕显示提示信息
scanf("%d,%d", &n1, &n2); //从键盘输入两个整数并分别保存在变量n1和n2
result = mul(n1, n2);
printf("the result is:%d\n", result); //输出变量result中的两个整数的乘积
}
/*
please input the two numbers:
3,5
the result is:15
*/
C程序的基本组成特点
-
函数是C程序的基本单位。每个C程序是由一个或多个函数构成。每个C程序有且仅有一个主函数,该主函数的函数名规定为main。
-
每个函数(包含主函数)的定义分为两个部分:函数首部和函数体。
-
函数首部: 返回值的类型 函数名(类型 形式参数名, ...) 函数体: { 数据定义部分 实现函数功能的语句串 } 注意:当函数没有返回值时写void
-
-
C程序中每个语句以“分号”作为语句的结束,“分号”是C语言的组成部分,不可以省略。但预处理命令和函数首部之后不能加分号。
-
#include <stdio.h> //编译预处理命令 int main(void) //函数首部不是一条完整的语句
-
-
C语言本身没有输入/输出语句,而是通过调用库函数
scanf()
、printf()
、getchar()
、putchar()
实现的 -
C语言的任任意位置都可以加注释,注释不编译。单行注释
\\注释
多行注释\*注释*\
-
程序的书写格式灵活,一行客书写多条语句,一条语句可以写在多行上,可以任意插入空格和回车。但为了程序清单层次分明、便于阅读,通常都采用缩进并对其的书写方法。一条说明一条语句占一行。使用空格或TAB缩进{}对齐。有足够的注释。有合适的空行
-
C语言中主函数和其他函数的位置是任意的,但程序执行总时从主函数开始,并在主函数结束。其他函数总是通过函数调用语句被执行
-
主函数可以调用其他函数;任何其他函数都可以相互调用,但不能调用主函数。
-
C程序中可以有预处理命令(例如
include
命令),通常预处理命令应放在程序的最前面。 -
C语言编译系统区分字母大小写。
C语言的运行步骤
C程序的调试
程序的错误分:语法错误和逻辑错误。
语法错误能够在编译过程中被发现并修改;
逻辑错误的程序往往可以顺利编译甚至执行,但执行的结果不同于预期。由于较难准确定位逻辑错误,所以程序开发环境一般都会提供程序调试工具来观察程序中各变量、寄存器等值的变化,以便发现程序中的逻辑错误。
调试手段:设置断点、重启调试、停止调试、逐语句调试、逐过程调试
第三章 数据类型、运算符和表达式
字符型 - 字符串只能是常量,C语言没有字符串变量,只有字符数组的存放字符串变量。
理解:变量是可以通过地址,变更数据值的量。字符串是个数组,并非固定字节,每个字符串都是创建一个新空间进行存储,无法通过地址变更值
char类型 - 存放的是字符的ASCII码值(无符号整数),占用内存1字节
有名常量
- 定义有名常量后,在后面定义同名变量的话,编译会报错
- 符号常量和有名常量的区别:符号常量的作用是在预编译阶段替换成常量;有名常量是一个名称定义值,这个名称的值程序不能改变;
进制转换
把八进制数按权展开、相加即可得十进制数,也就是让八进制各位上的系数乘以对应的权,然后求其和,如下:
十六进制化为十进制
用个位数+十位数16+百位数256+千位数*4096+…相乘的时候,前面的一位数乘以的数是十后面一位数乘以数的16倍.
具体案例如下:
(AB)=A×16+B=(171)
(ABC)=A×256+B×16+C=(2748)
第四章 结构化程序设计
第一节 结构化程序设计方法
- 自顶向下:计划好全局在行动
- 自底向上:先行动在计划
第二节 结构程序的三种基本结构
- 顺序结构: 顺序执行每个步骤,不存在未执行到的步骤
- 选择结构
- 单分支:仅包含一个条件,由【条件是否成立】来决定执行某个操作
- 双分支:包含一个条件,由【条件时是否成立】从两个操作中选区一个操作执行
- 多分支:包含n个条件,根据【某个条件是否成立】来决定执行某个操作
- 循环结构
- 当型:先判断条件,后执行循环体,直到条件不成立跳出循环
- 直到型:先执行循环体,后判断条件,直到条件不成立跳出循环
- 数量型:指定一个次数
n
,循环执行n
次循环体后停止循环
第三节 顺序结构程序设计
赋值语句:
- 【格式】:
变量 = 表达式;
- - 计算表达式的值,然后赋予变量。 - 【格式】:
变量 复合赋值表达式 表达式;
- - 将变量和表达式进行指定运算,将结果赋予变量
函数调用语句:
- 【格式】:
函数名(参数1, 参数2,...,参数n);
- - 调用指定函数和传入指定参数,处理逻辑
表达式语句
- 【格式】:
表达式;
- - 计算表达式的值
复合语句
- 【格式】:
下方代码块
- - 复合语句可以包含多条语句,但整体上是作为一条语句看待的。作用是函数体、循环体等场景
{
语句1;
语句2;
...
语句n;
}
字符处输入/输出函数
C语言的输入和输出操做,均是利用C语言编译胸痛提供的库函数实现的,C语语言本身并没有提供这两类语句。
字符输出函数putchar()
- 【调用格式】:
putchar(ch)
- 【参数】:
ch
可以是一个整型变量、字符型变量、整型常量或字符型常量,也可以是一个转义字符或整型表达式, - 【说明】:参数不能是一个字符串, 是字符串的情况下,单个字符则输出,超过两个字符的字符串,不输出也不报错
- 【功能】:把一个字符输出到标准输出设备(显示器)。此外,就功能而
print()
函数可以完全代替putchar()
函数的功能 - 【返回值】:输出ch对应的单个字符。
- 【实例】
#include <stdio.h>
void main(void){
int i=99;
char ch1='a';
putchar(i);
putchar(ch1);
putchar(101);
putchar('b');
putchar('\n');
putchar(2+100);
}
/*
caeb
f
--------------------------------
*/
字符输入函数getchar()
- 【调用格式】:
getchar()
- 【参数】:无参数。
- 【功能】:从标准输入设备(键盘)输入一个字符。另外,就功能而
scanf()
函数可以完全代替getchar()
函数的功能。 - 【说明】
getchar()
函数只能用于单个字符的输入,一次输入一个字符。输入的数字也是按字符处理。当输入多余一个字符时,只接收第一个字符。getchar()
函数输入的字符可以赋给一个字符变量或整型变量,也不可以不赋给任何变量,而作为表达式的一部分- 输入字符过程中,回车表示字符输入完成,如果存在多个
getchar()
函数,回车也会被当字符输入
- 【返回值】:输入的单个字符。
- 【实例】
getchar()
函数只能用于单个字符的输入,一次输入一个字符。输入的数字也是按字符处理。当输入多余一个字符时,只接收第一个字符。
#include <stdio.h>
void main(void){
int i;
char ch1;
i = getchar();
printf("input one value: %d", i);
}
/*
a
input one value: 97
*/
/*
bc
input one value: 98
*/
getchar()
函数输入的字符可以赋给一个字符变量或整型变量,也不可以不赋给任何变量,而作为表达式的一部分
#include <stdio.h>
void main(void){
int i;
char ch1;
i = getchar() + 1;
printf("input one value: %d", i);
}
/*
a
input one value: 98
*/
输入字符过程中,回车表示字符输入完成,如果存在多个getchar()
函数,回车也会被当字符输入
#include <stdio.h>
void main(void){
int i;
char ch1;
i = getchar() + 1;
printf("input one value: %d", i);
printf("input one value: %c", getchar());
printf("input one value: %c", getchar());
}
/*
a
input one value: 98input one value:
o
input one value: o
*/
格式输入/输出函数 print()
- 【调用格式】print(格式控制字符, 输出项表)
- 【参数】
- “格式控制字符串” 是由控制输出格式的字符组成的字符串。
- “输出项表”是用逗号分隔的若干表达式。
- 【功能】按照用户指定格式把指定的数据输出到标准输出设备(显示器)。
- 【返回值】 返回值为整型,等于正常输出的数据个数
- 【说明】:格式控制字符由格式说明符、附加格式说明字符、转义字符、普通字符组成
格式说明符
#include <stdio.h>
void main(void){
int num1=123;
long num2=123456;
float f=123.456;
double d1,d2;
d1 = 1111111111.111111111;
d2 = 2222222222.222222222;
printf("5d: %5d\n", num1); // 5表示输出数据所占的域宽,正数则代表输出的值右对齐,左边补空格
printf("-5d: %-5d\n", num1); // -5表示输出数据所占的域宽,负数则代表输出的值左对齐,右边补空格
printf("2d: %2d\n", num1); // 当输出数据宽度大于指定域宽时,按实际宽度输出
printf("ld: %ld\n", num2); // 输出长整型整数
printf("12f: %12f\n", f); // 12表示输出数据所占的域宽,正数则代表输出的值右对齐,左边补空格。
printf("12.2f: %12.2f\n", f); // 正数则代表输出的值右对齐,左边补空格;只输出两位小数,小数位大于两位,四舍五入
printf("-12.2f: %-12.2f\n", f); // 负数则代表输出的值左对齐,右边补空格;只输出两位小数,小数位大于两位,四舍五入
printf(".2f: %.2f\n", f); // 只输出两位小数,小数位大于两位,四舍五入
printf("5c: %5c\n", 'a'); // 正数则代表输出的值右对齐,左边补空格
printf("5s: %5s\n", "abc"); // 正数则代表输出的值右对齐,左边补空格
printf("-10s: %-10s\n", "abc"); // 负数则代表输出的值左对齐,右边补空格
}
/*
5d: 123
-5d: 123
2d: 123
ld: 123456
12f: 123.456001
12.2f: 123.46
-12.2f: 123.46
.2f: 123.46
5c: a
5s: abc
-10s: abc
*/
附加格式说明字符
#include <stdio.h>
void main(void){
int num1=123;
long num2=123456;
float f=123.456;
double d1,d2;
d1 = 1111111111.111111111;
d2 = 2222222222.222222222;
printf("5d: %5d\n", num1); // 5表示输出数据所占的域宽,正数则代表输出的值右对齐,左边补空格
printf("-5d: %-5d\n", num1); // -5表示输出数据所占的域宽,负数则代表输出的值左对齐,右边补空格
printf("2d: %2d\n", num1); // 当输出数据宽度大于指定域宽时,按实际宽度输出
printf("ld: %ld\n", num2); // 输出长整型整数
printf("12f: %12f\n", f); // 12表示输出数据所占的域宽,正数则代表输出的值右对齐,左边补空格。
printf("12.2f: %12.2f\n", f); // 正数则代表输出的值右对齐,左边补空格;只输出两位小数,小数位大于两位,四舍五入
printf("-12.2f: %-12.2f\n", f); // 负数则代表输出的值左对齐,右边补空格;只输出两位小数,小数位大于两位,四舍五入
printf(".2f: %.2f\n", f); // 只输出两位小数,小数位大于两位,四舍五入
printf("5c: %5c\n", 'a'); // 正数则代表输出的值右对齐,左边补空格
printf("5s: %5s\n", "abc"); // 正数则代表输出的值右对齐,左边补空格
printf("-10s: %-10s\n", "abc"); // 负数则代表输出的值左对齐,右边补空格
}
/*
5d: 123
-5d: 123
2d: 123
ld: 123456
12f: 123.456001
12.2f: 123.46
-12.2f: 123.46
.2f: 123.46
5c: a
5s: abc
-10s: abc
*/
格式输入/输出函数 scanf()
- 【调用格式】
scanf(格式控制字符,输出项首地址表)
- 【参数】
- “格式控制字符串” 是由控制输出格式的字符组成的字符串。
- “输入项首地址表”由若干个输入项首地址组成,相邻两个输入项首地址之间用逗号分隔
- 【功能】从键盘按照
"格式控制字符串"
中规定的格式读取若干个数据,然后按照输入项首地址表
的顺序,依次讲数据存入相应的变量对应的地址中 - 【返回值】 输入的数据个数
- 【说明】:格式控制字符由格式说明符、附加格式说明字符、转义字符、普通字符组成
公主历经千辛万苦,【蜡笔小新/情人节】