C语言程序设计

2021/07/11

程序设计语言基本成分

  1. 数据成分:描述程序所涉及的数据;
  2. 运算成分:描述程序中所有运算;
  3. 控制成分:描述程序的控制流程;
  4. 控制成分:表达数据的传输和输入输出。

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个字节,空间比较大

image-20210823225419837

标准库

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}$

image-20210720075031364

关系运算

特点:两个数比较,双目运算 ,目就是旁边的两个算数式

关系运算的优先级 高于赋值,低于算术

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;
}

目 录