程序设计语言基本成分
- 数据成分:描述程序所涉及的数据;
- 运算成分:描述程序中所有运算;
- 控制成分:描述程序的控制流程;
- 控制成分:表达数据的传输和输入输出。
C语言基础知识
标准
当前使用的标准是C90的规则
新标准已经出到C11了
*的运用
-
乘号
- 指针定义
- 取内容运算
// 乘号
a*b
// 指针
int *p
//
a = *p*p
字符集
C语言只支持ASCII码的值,给出多一个值它都不认识
-
数 字:0123456789
-
字 母:abc……z ABC……Z
-
运 算 符:+ - * / % = < > <= >= != == « » & && ^ ~ ()[] {} -> . ! ? : , ; “‘ - 特殊符号:_(下划线)回车(\r) 换行(\n) 制表符(\t)
标识符规则
-
基本标识符:变量名、函数名、 文件名、数组名、类型名
-
规则:字母或下划线开头,后面 是字母、下划线或数字
关键字
auto | break | case | char | const | continue |
enum | extern | float | for | goto | if |
short | signed | sizeof | static | struct | switch |
volatile | while |
运算符
- 算术运算符:+ - * / %
- 自增自减运算符: ++ –
- 关系运算符: < > <= >= == !=
-
逻辑运算符: && ! -
位运算符: ^ & « » ~ -
赋值 与赋值组合运算:= += -= *= /= %= «= »= = &= ^= - 条件运算符: ?:
-
其它:, * & (type) ( ) [ ] . -> sizeof
- 单目运算符:
++i
- 双目运算符:
a*b
- 三目运算符:
a>=b?x=1:x=2
复合运算符
- +=、-=、*=、/=、%=
C语言结构
为了重用、共享和分工,C程序采用函数结构;
#include "stdio.h" /*文件包含 若干*/
void main() /*主函数*/
{ /*函数体开始*/
print("How are you!\n"); /*语句 若干*/
} /*函数体结束*/
说明:
- main() 每个C程序必须有一个主函数
- { } 是函数开始和结束的标志,不可省
- ; 每个C语句以分号结束
- #include <.h> 包含标准库函数
常量
在程序运行中,其值 保持不变的量称为常量
常数直接在CPU中参与运算
- 整型 100,125,-100,0
- 实型 3.14, 0.125,-3.789
- 字符型 ‘a’,‘b’,‘2’
- 字符串 “a”,“ab”,”1232”
符号常量
较长的字符序列,用标识符来表示常量,无法修改
符号常量也是常数,不占内存。
例子:一个值不用在改变,并且很多地方都出现的时候,就可以使用符号常量来表示
*例程1*/
#include <stdio.h>
#include <stdlib.h>
#define PI 3.14 /*定义PI为3.14*/
int main()
{ int r=0;
float c=0,s=0;
scanf("%d",&r);
c=2*PI*r; /* 编译时用3.14替换PI */
s=PI*r*r; /* 编译时用3.14替换PI */
printf("c=%6.2f,s=%6.2f\n",c,s);
}
变量
在程序运行中,其值会发生变化的量
变量的定义: 变量是以标识符的形式来表示类型
变量必须先定义、赋值,之后才能使用;
格式:类型说明符 变量名表;变量可以多次赋值
常用的变量类型:
void main()
{
int a=1, b; /*说明a,b为整型变量 */
float c, s; /*说明c,s 为单精度实型变量 */
char cc; /*说明cc为字符变量 */
double x, y; /*说明x,y为双精度实型变量 */
}
内存分区
内存分为系统区、程序区、数据区,其中程序区和数据区都是属于用户区,用户可以自己操作
下图中数据区有r,c,s三个变量,r因为是int类型只占2字节的占用的内存最小,c和s分别都占用了4个字节,空间比较大
标准库
C语言自带的一些函数库
使用规则
// .h 头文件
// #include "头文件名"
// 距离引用数学函数
#include"math.h"
数学函数
在math.h
中
sqrt
- 求平方根的函数
#include <math.h>
#include <stdio.h>
void main(){
int t;
printf("%s", "Please input number:");
scanf("%d2", &t);
printf("To Calculate results:%.2f", sqrt(t));
}
/*
Please input number:9
To Calculate results:3.00
*/
sin
- 函数的功能是求某个角的正弦值。
字符函数
- 在
ctype.h
中
字符串函数
- 在
string.h
中
输入输出函数
在stdio.h
中
printf
- 按格式打印
】对应的格式输出对应的类型
】字符类型可以输出整型的值,根据ASCII码表查询对应的值输出
实例:
#include <stdio.h>
#define PI 3.14
void main(){
int r,c;
r = 3;
c = 97;
scanf("%d",&r);
printf("PI=%6.2f,r=%d,area=%6.2f\n",PI,r,PI*r); //%f 输出实型数据,%后面的6是输出宽度,2是小数点几位
printf("c=%d,b=%d\n",r,c); //%d输出整型数据
printf("c=%c c=%c\n",r,c);//%c 输出字符型数据
}
/*
scanf <- 120
PI= 3.14,r=120,area=376.80
c=120,b=97
c=x c=a
*/
格式
- %d:按十进制整数形式输出变量的值
- %o:按八进制整数形式输出变量的值
- %x:按十六进制整数形式输出变量的值
- %u 输出无符号整数变量的值
- %f:输出单精度浮点变量的值
- %e:按指数形式输出浮点变量的值
- %c:输出字符变量的值
- %s:输出一个字符串
- %ld:按十进制整数形式输出长整型变量的值
scanf
- 从终端上获取输入
执行这个函数时,终端的光标会闪闪
格式参照printf位置的格式
1.按照格式控制参数的要求,从终端上把 数据送到地址参数所指定的内存空间中
2.输入的值超出长度会自动截断获取指定长度的数据
3.读取时遇下列情况结束:回车,空格,宽度结束,非法输入
4.scanf不可以指定数据格式“%4.2f”,指定将导致语言系统的不理解,造成 原始数据错误
#include <stdio.h>
#include <stdlib.h>
void main(){
int a;
printf("input size is three number:");
scanf("%3d", &a); //从终端获取宽度为3的数字类型的数据,并把值送到变量a的地址
printf("You input is:%3d", a);
}
/*
input size is three number:123456789
You input is:123
*/
获取指定字符
一次调用只能输入一个字符,加上分号成为字符输入语句
getch()
- 输入字符,不回显,不回车
getche()
- 输入字符,并回显,不必回车
getchar()
- 输入字符,回车后才读入
输出指定的字符
一次调用只能输出一个字符
putchar(字符变量)
- 一次调用只能输出一个字符
#include <stdio.h>
void main(){
char c1, c2, c3;
c1 = getch();
printf("putchar output value:");putchar(c1);putchar('\n');
c2=getche();
printf("putchar output value:");putchar(c2);putchar('\n');
c3=getchar();
printf("putchar output value:");putchar(c3);putchar('\n');
}
/*
putchar output value:1
2putchar output value:2
3
putchar output value:3
*/
动态存储分配函数
- 在
stdlib.h
运算
C语言中有何种运算呢?
算数运算
整数相除可能得到实型结果,自动丢弃小数部分
实型数在计算机内部都按指数形式存放
实数不是精确值,将产生累计误差
示例:求一元二次方程$x^2 + x-2 = 0$的根
- 分析:对$ax^2+bx+c=0$,若 $b2-4ac≥0 $则方程有两个实根:$x = \frac{-b \pm\sqrt{b^2-4ac}}{2a}$
- 简化问题:
- $x1=(-b+ \sqrt{b * b - 4 * a * c} )/(2*a) $
- $x2=(-b- \sqrt{b * b - 4 * a * c} )/(2*a)$
- C语言中算数表达式:
x1=(-b+sqrt(b*b-4*a*c))/(2*a)
x2=(-b-sqrt(b*b-4*a*c))/(2*a)
- 实际代码:
#include <math.h>
#include <stdio.h>
void main(){
float a, b, c, d, x1, x2, q;
printf("Please enter value of abc:");
scanf("%f,%f,%f", &a, &b, &c);
d = b*b-4*a*c;
q = sqrt(d);
x1 = (-b+1)/(2*a);
x2 = (-b-q)/(2*a);
printf("d=%.2f,x1=%.2f,x2=%.2f\n", d, x1, x2);
}
/*
Please enter value of abc:2,2,-3
d=28.00,x1=-0.25,x2=-1.82
*/
整数相除
*注意事项:*- 整数相除结果只取整数,小数部分丢失,造成后续运算结果错误
- 实数不是精确值,将产生累计误差
超出表示范围的数机器如何处理:
- 实型数的分辨率:
- 最小正数:10-38 小于该数时处理为0下溢
- 最大正数:1038 大于该数时提示出错 上溢
实型数在计算机内部都按指数形式存放
实型数在运算器中都按双精度计算
内存的存储精度取决于对变量的定义
数的有效位限制在最后输出时是按照存储结构和输出格式确定的
规格化处理
计算机的基本存储原理
存储资源的合理使用
实数有效位:单精度7位
实行数的存储做了规格化处理
规格化处理:小数点在第一个有效位前面,大小由指数部分控制。解:这样可以减少存储的空间
举个例子:0.00123456在内存中存储$0.123456\times10^{-2}$
关系运算
特点:两个数比较,双目运算 ,目就是旁边的两个算数式
关系运算的优先级 高于赋值,低于算术
C语言中没有专用的逻辑型数据, 用数值 1和 0标识逻辑 真 和 假。 关系运算的结果: 1–真 0–假
-
使用格式:算数式 关系运算符 算数式
-
关系运算符:\>,>=, <, <= !=, ==
-
红色关系运算符的优先级大于橙色的关系运算符
#include <stdio.h>
void main(){
int a=2, b=6, c;
c = a+(b%6!=0); // 2+0 , 0是由取余操作的结果为0,0做非运算后得到假(0)
printf("c vlaue is %d", c);
}
/*
c vlaue is 2
*/
实例代码
C语言的开始
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
printf("Hello, world!\n");
return 0;
}
求两数之和
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int a,b,sum;
a=123;
b=456;
sum=a+b;
printf("sum is %d\n", sum);
return 0;
}