第三章 最简单的C程序设计——顺序程序设计

本文介绍了C语言的基础知识,包括顺序程序设计、数据类型的使用,如整型、浮点型、字符型以及常量和变量的概念。通过实例展示了如何进行温度转换,并详细阐述了常量的分类、数据类型的表示形式和运算符的使用。此外,还讲解了输入输出函数`scanf`和`printf`的使用方法,以及在输入输出中需要注意的事项。
摘要由CSDN通过智能技术生成

第三章 最简单的C程序设计——顺序程序设计

为了能编写出C语言程序,必须具备以下的知识和能力:
(1)要有正确的解题思路,即学会设计算法,否则无从下手;
(2)掌握C语言的语法;
(3)在写算法和编写程序时,要采用结构化程序设计方法,编写出结构化的程序。

3.1 顺序程序设计举例

【例3.1】有人用温度计测量出用华氏法表示的温度(如64℉),今要求把它转换为摄氏度表示的温度(如17.8℃)。
转换公式:

c = 5 / 9 ( f − 32 ) c = 5/9 (f-32) c=5/9(f32)
【解】

#include<stdio.h>

int main()
{
	float f,c;
	printf("请输入华氏度:");
	scanf("%f", &f);
	c = (5.0/9.0)*(f-32);
	printf("%f℉ = %f℃", f, c);
	return 0;
}

3.2 数据的表现形式及其运算

3.2.1 常量和变量

在计算机高级语言中,数据又两种表现形式:常量和变量。

1. 常量

常用的常量有以下几类:

  • (1)整型常量。如123,1000
  • (2)实型常量。有两种表示形式:
    • 十进制小数形式,由数字和小数点组成,如123.456,3.1415
    • 指数形式,如12.34e3(表示 12.34 × 1 0 2 12.34×10^2 12.34×102)
  • (3)字符常量。由两种形式的字符常量:
    • 普通字符,用单撇号括起来的字符,如’a’,‘Z’,‘3’,‘?’。不能写成’ab’或’12’。注意单撇号只是界限符,字符常量只能是一个字符,不包括单撇号。'a’和’A’不是相同的字符常量。字符常量存储在计算机存储单元中时,并不是储存字符本身,而是以其代码(ASCII)存储的。
    • 转义字符,以字符“\”开头的字符序列,如"\n"表示换行。下表为常见的转义字符:在这里插入图片描述
  • (4)字符串常量。如"boy","123"等,用双撇号把若干个字符括起来,字符串常量是双撇号中的全部字符(但不包括双撇号本身)。注意不能用单撇号。单撇号内只能包含一个字符,双撇号内可以包含一个字符串。
  • (5)符号常量。用#define指令,指定用一个符号表示一个常量。如:
#define PI 3.1416 //注意行末没有分号

(注意行末没有分号)
经过以上的指定后,本文件中从此行开始所有的PI都代表3.1416。在对程序进行编译前,预处理器先对PI进行处理,把所有的PI都置换成3.1416.这种用一个符号名代表一个常量的,称为符号常量。。使用符号常量有以下好处:

  1. 含义清楚。在定义符号常量名时应考虑“见名知义”。
  2. 在需要改变程序中多处用到的同一个常量时,能做到“一改全改”。

注意:要区分符号常量和变量,不要把符号常量误认为变量。符号常量不占内存,只是一个临时符号,代表一个值,在预编译后这个符号就不存在了,故不能对符号常量进行重新赋值。为与变量名相区别,习惯上符号常量用大写表示,如PI,PRICE等。

2. 变量

变量代表一个有名字的、具有特定属性的一个存储单元。它用来存放数据,也就是存放变量的值。在程序运行期间,变量的值是可以改变的。
变量必须先定义,后使用。在定义时指定该变量的名字和类型。一个变量应该有一个名字,以便被引用。请注意区分变量名变量值这两个不同的概念。变量名实际上是以一个名字代表的一个存储地址。在对程序编译连接时由编译系统给每一个变量名分配对应的内存地址。从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据。在这里插入图片描述

3.常变量

C 99允许使用常变量,方法是在定义变量时,在前方贾义国关键字const,如:

#define PI 3.1415926		//定义符号常量
const float pi = 3.1415926; //定义常变量

定义pi为一个浮点型变量,指定其值为3.1415926,而且在变量存在期间其值不能改变。
常量与常变量的异同是:常变量具有变量的基本属性:有类型,占存储单元,只是不允许改变其值。可以说,常变量是有名字的不变量,而常量是没有名字的不变量。有名字就便于在程序中被引用。
符号常量PI和常变量pi都代表3.1415926,在程序中都能使用。但二者的性质不同:定义符号常量用#define指令,它是预编译指令,它只是用符号常量代表一个字符串,在预编译时仅进行字符替换,在预编译后,符号常量就不存在了(全置换成3.1415926)。对符号常量的名字是不分配存储单元的。而常变量要占用存储单元,有变量值,只是该值不改变而已。从使用的角度看,常变量具有符号常量的优点,而且使用更方便。有了常变量以后,可以不必多用符号常量
有些编译系统还为实现C 99的功能,因此不能使用常变量

4. 标识符

在计算机高级语言中,用来对变量、符号常量名、函数、数组、类型等命名的有效字符序列统称为标识符。简单地说,标识符就是一个对象的名字。前面用到的变量名,符号常量名,函数名printf等都是标识符。
C语言规定标识符只能由字母、数字下划线 3种字符组成,且第一个字符必须为字母或下划线
一般而言,变量名用小写字母表示

3.2.2 数据类型

C语言允许使用的类型如下:
在这里插入图片描述
其中基本类型(包括整型和浮点型)和枚举类型变量的值都是数值,统称为算术类型。算术类型和指针类型统称为纯量类型,因为其变量的值是以数字来表示的。枚举类型是程序中用户定义的整数类型。数组类型和结构体类型统称为组合类型,共用体类型不属于组合类型,因为在同一时间内只有一个成员具有值。函数类型用来定义函数,描述一个函数的接口,包括函数返回值的数据类型和参数的类型。
不同的数据在内存中占用的存储单元长度是不同的,存储不同类型数据的方法也是不同的。

3.2.3 整型数据

1. 整型数据的分类
  • 基本整型(int型):编译系统一般给int型数据4个字节(有的编译系统仅分配2个字节),范围是 [-231, 231-1] (2个字节的范围是[-215, 215-1]。虽然4个字节有32位,但第一位是用来表示正负的,所以数字部分仅有15位(2个字节同理)。int型在存储单元中的存储方式是:用整数的补码形式存放。一个正数的补码是此数的二进制形式,如5的二进制形式是101。如果是一个负数,则应先求出负数的补码。求负数补码的方式是:先将此数的绝对值写成二进制形式,然后对其所有二进制按位取反,再加一。下图是用两个字节存放一个整数的情况:在这里插入图片描述
  • (2)短整型(short int):类型名为short int或short。若整型是以4字节存储,则短整型以2字节存储。
  • (3)长整型(long long int):类型名为long long int 或long long,一般分配8个字节。这是C 99新增的类型。
    sizeof是测量类型或变量长度的运算符。C标准要求long型数据长度不短于int型,short型不长于int型,即
sizeof(short)sizeof(int)sizeof(long)sizeof(long long)
2.整型变量的符号属性

在这里插入图片描述
在实际应用中,有的数据的范围常常只有正值(如学号、年龄、库存量、存款额等)。为了充分利用变量的值的范围,可以将变量定义为**“无符号”**类型。可以在类型符号前面加上修饰符unsigned,表示制定该变量是“无符号整数”类型。如果加上修饰符signed,则是“有符号类型”。因此,在以上4种整形数据的基础上可以扩展为以下8种整形数据:
在这里插入图片描述
以上有*的是C 99增加的,方括号表示其中的内容是可选的,既可以有,也可以没有。如果既未指定为signed也未指定为unsigned,默认为“有符号类型”。如signed int a和int a等价。
有符号整型数据存储单元中最高位代表数值的符号(0为正,1为负)。如果制定unsigned型,存储单元中全部二进位都用作存放数值本身,而没有符号。无符号型变量只能存放不带符号的整数,如123,4568等,而不能存放负数。因此,无符号整型变量中可以存放的正数的范围比一般整型变量中正数的范围扩大一倍。
==注意:
(1)只有整型(包括字符型)数据可以加signed或unsigned修饰符,实型数据不能加。
(2)对无符号整型数据用"%u"格式输出。%u表示用无符号十进制的格式输出。

3.2.4 字符型数据

由于字符是按其代码(整数)形式存储的,因此C 99把字符型数据作为整数类型的一种。但是,字符型数据在使用上有自己的特点,因此把它单独列为一节来介绍。

1.字符与字符代码

字符与字符代码并不是任意写一个字符,程序都唔那个识别的。例如代表圆周率的Π在程序中是不能识别的,只能使用系统的字符集中的字符。各种字符集的基本集都包括了127个字符,其中包括:

  • 字母:大写英文A-Z,小写英文字母a-z;
  • 数字:0-9
  • 专门符号:29个,包括:!"#&’()*+,-.;:等
  • 不能显示的字符:空(null)字符(以’\0’表示)、警告(以’\a’表示)、退格(以’\b’表示)、回车(以’\r’表示)等;

所有127个字符都可以用7个二进位表示。所以在C语言中,指定用一个字节存储一个字符。此时,字节中的第一位置位0在这里插入图片描述

2. 字符变量

字符变量是用类型符char定义字符变量。如:

char c = '?';

定义c为字符型变量并使初值为字符’?’。‘?'的ASCII代码是63,系统把整数63赋给变量c。
c是字符变量,实质上是一个字节的整型变量,由于它常用来存放字符,所以称为字符变量。可以把0-127之间的整数赋给一个字符变量。
在输出字符变量的值时,可以选择以十进制整数形式输出,或以字符形式输出,如:

printf("%d %c\n",c,c)

输出的结果是:

63 ?

用%d格式输出十进制整数63,用%c格式输出字符’?’

前面介绍了整型变量可以用signed和unsigned修饰符表示符号属性。字符类型也属于整型,也可以用signed和unsigned修饰符。如:
在这里插入图片描述
在使用有符号字符型变量时,允许存储的值为-128~127,但字符的代码不可能为负值,所以在存储字符时实际上只用到了0~127这一部分,其第一位都是0.

3.2.5 浮点型数据

浮点型数据是用来表示具有小数点的实数的。为什么在C中把实数称为浮点数呢?在C语言中,实数是以指数形式存放在存储单元中的。一个时许表示为指数可以有不止一种形式,如3.14159可以表示为3.14159×100, 0.314159×101, 0.0314159×102, 31.4159×10-1, 314.159×10-2等,它们代表同一个值。可以看到:小数点的位置是可以在314159几个数字之间、之前或之后(加0)浮动的,只要在小数点浮动的同时改变指数的值,就可以保证它的值不会改变。由于小数点位置可以浮动,所以实数的指数形式称为浮点数
浮点数类型包括如下几个:

  • float型(单精度浮点型)。编译系统为每一个float型变量分配四个字节,数值以规范化的二进制数指数形式存放在存储单元中。在存储时,系统将实型数据分成小数部分和指数部分两个部分分别存放。小数部分的小数点前面的数为0。如3.14159在内存中的存放形式可以用下图表示:在这里插入图片描述
    上图是以十进制数来表示的,实际上在计算机中是用二进制数来表示小数部分以及用2的幂次来表示指数部分的。在4个字节中,究竟用多少位来表示小数部分,多少位来表示指数部分。C标准并无具体规定,由各C语言编译系统自定。有的C语言编译系统以24位表示小数部分(包括符号)。以8位表示指数部分(包括指数的符号)。由于用二进制形式表示一个实数以及存储单元的长度是有限的,因此不可能得到完全精确的值,只能存储成有限的精确度。小数部分占的位数越多,数的有效数字越多,精度也就越高。指数部分占的位数愈多,则能表示的数值范围愈大。float型数据能得到6位有效数字,数值范范围为-3.4×10-38~3.4×1038
  • double型(双精度浮点型)。为了扩大能表示的数值范围,用8个字节存储一个double型数据,可以得到15位有效数字,数值范围为-1.7×10-308~1.7×10308。为了提高运算精度,在C语言中进行浮点数的算术运算时,将float型数据都自动转换为double型,然后进行运算。
  • long double型(长双精度型)。
  • 在这里插入图片描述
    在这里插入图片描述

3.2.6 怎样确定常量的类型

从常量的表示形式即可以判定其类型。对于字符常量很简单,只要看到由单撇号括起来的单个字符或转义字符就可以知道它是字符常量。对于数值常量按以下规律判断:

  • 整型常量:不带小数点的数值就是整型常量,但应注意其有效范围。在一个整数的末尾加上大写字母L或小写字母l都表示它是长整型。
  • 浮点型常量。凡是以小数形式或指数形式出现的实数均是浮点型常量。C编译系统把浮点型常量都按双精度处理,分配8个字节。在这里插入图片描述

3.3 运算符和表达式

3.3.1 C运算符

在这里插入图片描述

3.3.2 基本的算术运算符

在这里插入图片描述
1、两个实数相除的结果是双精度实数,两个整数相除的结果为整数,会舍去小数部分。但是如果除数或被除数中有一个为负值,则舍入的方向是不固定的。如-5/3,有的系统中得到的结果为-1,有的是-2
2、%运算符要求参加运算的运算对象为整数,结果也是整数

3.3.3 自增(++)、自减(–)运算符

在这里插入图片描述

3.3.4 算术表达式和运算符的优先级与结合性

用算术运算符和括号将运算对象(也称操作数)连接起来的
符合C语法规则的式子称为C算术表达式。运算对象包括常量、变量、函数等。
C语言规定了运算符的优先级,即先乘除后加减,同级运算从左至右的结合方向。
算术运算符是从左至右,赋值运算符是自右向左。

3.3.5 不同类型数据见的混合运算

在这里插入图片描述

3.3.6 强制类型转换运算符

在这里插入图片描述
其一般形式为:
(类型名)(表达式)
注意,表达式应用括号括起来,如果写成(int)x+y则只将x转换成整型,然后与y相加。
在这里插入图片描述

3.4 C 语句

3.4.1 C语句的作用和分类

一个函数包含声明部分执行部分,执行部分是由语句组成的,语句的作用是向计算机系统发出操作指令,要求执行相应的操作。一个C语句经过编译后产生若干条机器指令。声明部分不是语句,它不产生机器指令,只是对有关数据的声明。
C程序结构可以用下图表示:
在这里插入图片描述
一个C程序可以由若干个源程序文件(编译时以文件模块为单位)组成,一个源文件可以由若干个函数和预处理指令以及全局变量声明部分组成。一个函数由数据声明部分和执行语句组成。
C语句分为以下5类:
(1)控制语句
在这里插入图片描述
上面9种语句表示形式中的()表示括号中是一个“判断条件”,“…”表示内嵌语句。例如上面的“if()…else…”的具体语句可以写成:

if (x>y) z=x; else z=y

在这里插入图片描述
(2)函数调用语句
由一个函数调用加一个分号构成。

printf("Hello world");

(3)表达式语句:表达式语句由一个表达式加一个分号构成

a=3;

(4)空语句:空语句只有一个分号,什么也不做。空语句可以用来作为流程的转向点(流程从程序的其他地方转到此语句处),也可用来作为循环语句种的循环体(循环体是空语句表示循环体什么也不做)
(5)复合语句:可以用{}把一些语句和声明括起来成为复合语句(又称为语句块)。例如:

{
	float pi=3.14159, r=2.5,area;
	area = pi * r * r;
	printf("area=%f",area);
}

3.4.2 最基本的语句——赋值语句

(比较简单,自己看课本)

3.5 数据的输入输出

3.5.1 输入输出举例

求 a x 2 + b x + c = 0 方 程 的 根 。 a , b , c 由 键 盘 输 入 。 求ax^2+bx+c=0方程的根。a,b,c由键盘输入。 ax2+bx+c=0a,b,c


#include <stdio.h>
#include <math.h>

int main()
{
    double a, b, c;
    int calculate(double a, double b, double c);
    printf("请输入一元二次方程abc的值:");
    //输入双精度型变量的值要用格式声明%lf
    scanf("%lf%lf%lf", &a, &b, &c);
    calculate(a, b, c);
    return 0;
}

int calculate(double a, double b, double c)
{
    double p, q, delta, x1, x2;
    delta = b * b - 4 * a * c;
    if (delta < 0)
    {
        printf("此函数Δ<0,故没有实数解\n");
        return 0;
    }
    p = -b / (2.0 * a);
    q = sqrt(delta) / (2.0 * a);
    x1 = p + q;
    x2 = p - q;
    printf("x1 = %7.2f\nx2 = %7.2f\n", x1, x2);
    return 0;
}

(1)用scanf函数输入a,b,c的值,请注意在scanf函数括号内的变量a,b,c前面,要用地址符&,即&a,&b,&c,&a表示变量a在内存中的地址。该scanf函数表示从终端输入的3个数据分别送到地址为&a,&b,&c的存储单元,也就是赋给变量a,b,c.。双撇号内双精度变量用%lf格式声明,表示输入的是双精度实数。
(2)在scanf函数中,格式声明为"%lf%lf%lf",连续3个“%lf”。要求输入3个双精度实数。请注意在程序运行时应怎样输入数据。两个数之间用空格分开“1 3 2”。如果用其他符号(如逗号)则会出现错误。现在输入的是整数,但由于指定用%lf格式输入,因此系统会先把这3个整数转换成实数1.0 3.0 2.0,然后赋值给变量a,b,c。
(3)在printf函数中,不是简单地用%f格式声明,而是在格式符f的前面加了“7.2”,表示在输出x1和x2时,指定数据占7列,其中小数占2列。这么做的好处是:

  • 可以根据实际需要来输出小数的位数,多出的小数按四舍五入处理
  • 如果输出多个数据,各占一行,而用同一个格式声明可以使输出数据的小数点对齐,整齐美观。

3.5.2 有关数据输入输出的概念

(1)输入输出是以计算机为主体而言的
在这里插入图片描述
(2)C语言本身不提供输入输出语句
(3)要在程序文件的开头用预处理指令#inlcude把有关头文件放在本程序中
预处理指令#include还有一种形式,头文件用双撇号括起,如:#include “stdio.h”。
如果采用双撇号,则编译系统会先在用户的当前目录或指定目录中寻找要包含的文件,找不到再按照标准方式找,即从存放C编译系统的子目录中去找所要包含的文件。而用尖括号则是直接用标准方式找。用双撇号一般都是用户自己编写的头文件,不是系统提供的。如果头文件不在当前目录,则可以在双撇号中指定文件路径:#include “C\temp\file1.h”

3.5.3 用printf输出数据

1. printf函数的一般格式:

printf(格式控制, 输出表列)
如:

printf("%d, %c\n",i,c);

括号内包括两个部分:
(1)“格式控制” 是用双撇号括起来的一个字符串,成为格式控制字符串,简称格式字符串。它包括两个信息:

  • 格式声明。格式声明由%和格式字符组成,如%d、%f等。它的作用是讲输出的数据转换为注定的格式后输出。格式声明总是由%字符开始的。
  • 普通字符。普通字符即需要在输出时原样输出的字符。例如上面printf函数中双撇号内的逗号、空格和换行符,也可以包括其他字符。

(2)输出列表是程序需要输出的一些数据,可以是常量、变量或表达式。如:
在这里插入图片描述

printf函数的一般形式可以表示为:
在这里插入图片描述

2. 格式字符

(1)d格式符。用来输出一个有符号的十进制整数。
(2)c格式符。用来输出一个字符。
(3)s格式符。用来输出一个字符串。
(4)f格式符。用来输出一个实数(包括单、双精度、长双精度),以小数形式输出,有几种用法:

  • 基本型,用%f。不指定输出数据的长度,由系统根据数据的实际情况决定数据所占的列数。系统处理的方法一般是:实数中的整数部分全部输出,小数部分输出6位。
  • 指定数据宽度和小数位数,用%m.nf。如“%7.2f”格式指定输出的数据占7列,其中包括小数2位,对后一位采取四舍五入的方法处理,即向上或向下取近似值。
    在用%f输出时注意数据本身能提供的有效数字,如float型数据的存储单元只能保证6位有效数字,double型数据能保证15位有效数字,不要认为计算机输出的所有数据都是绝对精确的
  • **输出的数据向左对齐,用%-m.nf。**当数据长度不超过m时,数据向左靠,右端补空格。

(5)e格式符。用格式声明%e指定以指数形式输出实数。如果不指定输出数据所占的宽度和数字部分的小数位数,许多C编译系统会自动给出数字部分的小数位数位6位,指数部分占5列。指定的例子:"%13.2e",表示输出的实数占13列宽度,小数部分占2位。
(6)其他格式符。用的不多,了解即可。

  • i格式符。与d格式符相同。一般就用d。
  • o格式符。以八进制整数形式输出。
  • x格式符。以十六进制形式输出整数。
  • u格式符。用来输出无符号型整数,以十进制整数形式输出。
  • g格式符。用来输出浮点数,系统自动选择f格式或e格式输出,选择其中长度较短的格式,不输出无意义的0。
    在这里插入图片描述
    在这里插入图片描述

3.5.4 用scanf函数输入数据

1. scanf函数的一般形式

scanf(格式控制, 地址表列)
“格式控制”的含义同printf函数。“地址表列”是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。

2. scanf函数中的格式声明

在这里插入图片描述
在这里插入图片描述

3. 使用scanf函数时应注意的问题

(1)scanf函数中的格式控制后面应当是变量地址,而不是变量名。比如之前用的&a
(2)如果在格式控制字符串中除了格式声明意外还有其他字符,则在输入数据时在对应的位置上应输入与这些字符相同的字符在这里插入图片描述
(3)在用“%c”格式声明输入字符时,空格字符和“转义字符”中的字符都作为有效字符输入在这里插入图片描述
在这里插入图片描述
(4)在输入数值数据时,如输入空格、回车、Tab键或遇非法字符(不属于数值的字符),认为该数据结束在这里插入图片描述

3.5.5 字符输入输出函数

1. 用putchar函数输出一个字符

putchar(c)
c可以是字符常量、整型常量、字符变量或整型常量(其值在字符的ASCII代码范围内)

2. 用getchar函数输入一个字符

在这里插入图片描述
连续输入多个字符需要在输入完成后按下enter键敲击的字符才被输入进计算机。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值