配色: 字号:
《C语言程序设计项目式教程》04 计算个人所得税写字字帖
2023-05-24 | 阅:  转:  |  分享 
  
第 一 章第四章学习目标了解浮点型相关知识掌握结构体的含义掌握结构体数组的定义和使用掌握引入文件的意义 具有文件基本操作的能力学习路径任务一
计算个人所得税后输出浮点型 (1)浮点型概念 浮点型用于描述现实生活中的实数,例如 1.2、123.45
等,基本类型为 float。可以根据取值 的范围和数据精度的不同,通常情况下,将浮点数分为单精度(float)和双精度(doubl
e)。浮点型 (2)浮点型常量 浮点型也称为实型。浮点型常量也称为实数或者浮点数。在 C 语言中,实数只采用十进
制。它有二种形式:十进制小数形式和指数形式。 1) 十进制数形式:由数码 0~ 9 和小数点组成。
2)指数形式:由十进制数,加阶码标志“e”或“ E”以及阶码(只能为整数,可以带符号)组 成。其一般格式为:a E n(a
为十进制数, n 为十进制整数,表示阶码),其值为 a×10n。1.0、15.8、5.678、- 0.13、500.、- 267
.8230 等均为合法的实数。3.2E5 (等于 3.2×105),4.7E-2 (等于 4.7×10-2),0.6E7 (等于
0.6×107浮点型 (3)浮点型变量 C 语言中浮点型变量指的就是实数变量(存放可以带小数的数据的变量), 分
为两类: float(单精度型)和 double(双精度型) 。 float d; / 声明浮点型变量 d
/double real; / 声明双精度型变量 real/格式输出函数 printf() (1)其中类型符号用以表示
输出数据的类型 C 语言中浮点型变量指的就是实数变量(存放可以带小数的数据的变量), 分为两类: float(单精
度型)和 double(双精度型) 。 格式输出函数 printf() (2)精度:精度格式符以“.”开头,后跟十进
制整数。本项的意义是:如果输出数字,则表 示小数的位数;如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数, 则
截去超过的部分。表达式中的类型转换(1)自动转换 在某种范围内整型数据可以和字符型数据通用,而整型是浮点型的一种特
殊形式。因此, 整型、浮点型和字符型数据之间可混合运算。例如:3.45+10+''a''-2.5''c'',是合法的。在混合运 算时,编
译系统先将不同数据类型数据自动转换成同一类型,再进行运算。 表达式中的类型转换自动转换遵循以下规则:①若参与运算量的类型不同,则先
转换成同一类型,然后进行运算。②转换按数据长度增加的方向进行,以保证精度不降低。③所有的浮点运算都是以双精度进行的,即使仅含 fl
oat 单精度量运算的表达式,也要先转换成 double 型,再作运算。④ char 型和 short 型参与运算时,必须先转换成
int 型。 ⑤在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量 的类型。表达式中的类型转换(2)强
制类型转换 除了自动类型转换之外,程序设计人员还可以根据运算的要求,在程序中强行将数据的类 型进行转换,称为强制
类型转换。强制类型转换是通过类型转换运算来实现的,其一般格式如下:(类型说明符) (表达式)表达式中的类型转换格式说明①强制类型
转换符的功能是把表达式的运算结果强制转换成类型说明符所表示的类型。 ②类型说明符和表达式都必须加括号(单个变量可以不加括号)。③无
论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行 的临时性转换,而不改变数据说明时对该变量定义的类型 if
-else 嵌套结构 在程序设计中,经常使用级联的 if-else-if 实现多路分支结构一般格式:if ( 表达式 1) 语句
1; else if ( 表达式 2) 语句 2; else if ( 表达式 3) 语句 3; … else if ( 表达式
m) 语句 m; Else 语句 m+1 if-else 嵌套结构 在程序设计中,经常使用级联的 if-else-if 实现多路分
支结构一般格式:条件语句使用小结 一个表达式的返回值都可以用来判断真假,除非没有任何返回值的 void 型和返回
无法判 断真假的结构。当表达式的值不等于 0 时,它就是“真”,否则就是假。一个表达式可以包含 其他表达式和运算符,并且基于整个表
达式的运算结果可以得到一个真或假的条件值。因此, 当一个表达式在程序中被用于检验其真或假的值时,就称为一个条件。 条件语句使用小结
(1) if 语句 if (表达式) 语句 1;如果表达式的值为非 0,则执行语句 1,否则跳过语句继续执行下
面的 语句。如果语句 1 有多于一条语句要执行时, 必须使用 { 和 } 把这些语句包括在其中, 此时 条件语句形式为:if(表达
式) { 语句 1; }条件语句使用小结 (2) if-else 语句 除了可以指定在条件为真时执
行某些语句外,还可以在条件为假时执行另外一段代码。 在 C 语句中利用 else 语句来达到这个目的。if—else 语句格式为:
if( 表达式 ) 语句 1; else 语句 2条件语句使用小结 (3)if-else 嵌套
条件语句可以嵌套,这种情况经常碰到,但条件嵌套语句容易出错,其原因主要是不知道 哪个 if 对应哪个 else。其语句格式为:if
( 表达式 1) 语句 1; else if( 表达式 2) 语句 2; else if( 表达式 3) 语句 3; …… els
e 语句 n条件语句使用小结 (4)switch-case 语句 执行 switch 开关语句时,将变量逐个与 cas
e 后的常量进行比较,若与其中一个相等,则执行该 常量下的语句,若不与任何一个常量相等,则执行 default 后面的语句。其语句
格式为: switch( 变量 ) { case 常量 1: 语句 1 或空; break; case 常量 2: 语句
2 或空; break;…… case 常量 n: 语句 n 或空; break; default: 语句 n+1 或空;
}任务二 将税率表存放在结构体数组中,然后再计算 个人所得税并输出结构体的意义 首先考虑解决下面一个问题,输入一个
学生的学号、姓名、性别、班级以及他的数学、外语 和语文的三科课程成绩,求出他的总分和平均分。 问题分析:通过该项
目的问题描述,可知通过顺序结构就可以编写出这个项目的解决程 序,用四个字符数组变量分别表示学号、姓名、性别、班级;用三个浮点类型变
量表示学生的三 科成绩,然后通过计算求出总分和平均分并输出即可。结构体类型的定义 C 语言提供了一个重要的构造数据
类型——结构体类型,来解决复杂事物表示问题,它将多个数据项集合到一个数据类型中,每个数据项目被称为数据成员,它们可以是不同的数据类
型,既可以是基本数据类型,也可以是另一种构造数据类型。结构体数据类型的一般定义 如下:struct 结构体名 { 数据类型
1 成员名 1; 数据类型 2 成员名 2; 数据类型 3 成员名 3; …… ……
数据类型 n 成员名 n; };结构体类型变量的定义 上面声明了一个结构体类型,它相当于一个模型,其中并无具体数
据,只有定义了具有结 构体类型的变量之后,才能在其中存放具体的数据。在 C 语言中,可以使用三种方式定义结构 体类型的变量: (1
) 直接声明结构体类型变量 这种方式要求在 struct 后不使用结构体名,例如:struct{ ……
} st1,st[2];结构体类型变量的定义(2)先定义结构体类型,再单独声明结构体类型变量这种方式要求先定义结构体类型,再由一条
单独的语句声明变量,例如:struct student{ …… } ; struct student st1,st[2];结
构体类型变量的定义(3) 定义类型的同时声明变量 这种方式将类型的定义和变量的声明放在一起,例如:struct student{
…… } st1,st[2];关键字 typedef 的用法 在结构体类型变量的第二种声明方式中,要用关键字
struct 和结构体名共同来声明变量, 尤其当结构体名称较长时,记忆起来不方便,C 语言提供了关键字 typedef 来简化类
型定义,提高程序的可读性。 C 语言允许用 typedef 来说明一种新类型名,其一般格式如下: typedef
原类型名 新类型名结构体变量的引用和初始化 (1)结构体变量的引用 声明完一个结构体类型的变量之后,就可以在程序
中使用它了。但是,要注意的是:不能 将一个结构体变量作为一个整体来直接使用,只能通过引用变量中的成员来实现对结构体变 量的使用。引
用结构体变量中成员的格式为: 结构体变量名 . 成员名结构体数组的声明 结构体类型是将多个不同基类型的数据组合在一
起表示特定的学生,当需要对一个班级 的 30 名学生数据进行处理的时候,显然就要用到数组了,这就是结构体数组。结构体数组的 每个元
素都是具有相同结构类型的下标结构体变量。在实际应用中,经常用结构体数组来表 示具有相同数据结构的一类数据。 结构体数组的声明(1
)先定义结构体类型,再声明结构体数组 这种方式先定义一个结构体类型,然后用该类型名声明数组,这是一种间接定义方式
。 struct student{ char sno[8]; char sname[10]; char sex[
2]; char cname[30]; }; struct student st[3];结构体数组的声明(2)在声明结构体类
型的同时声明结构体数组,这是一种直接声明方式。 struct student{ char sno[8];
char sname[10]; char sex[2]; char cname[30]; } st[30];结构体数组
的初始化和其他类型数组一样,对结构体数组可以进行初始化,其一般格式如下: struct 结构体类型名{ 成员定义列表;
} 结构体数组名 ={ {…}, {…},… };struct student{ char sno[8]; char
sname[10]; char sex[2]; char cname[30]; } st[2]={{"200701
01","Zhang san","1","class one"},{"20070201","Li si","1", "class
two"}}结构体数组的应用实例 例如求出 3 个学生中最高分数的学生姓名和成绩信息。设学生信息只有姓名信息和
成绩信息两个成员,学生姓名在数组定义时初始化,输入学生的成绩,要求最后输出分数最高 的学生姓名和成绩。 数组名作为函
数参数 C 语言规定,一个数组名代表数组的内存首地址,即数组的第一个元素的地址,它实际上 是一个地址值。要向函数
传递整个数组时,给出数组名和数组大小就可以了。 数组名作函数参数时应注意: (1) 应该在调用函数和被调用函数中分别声明数组,且数
据类型必须一致,否则结果将 出错。 (2) 形参数组可以不指定大小,但需另设一个参数传递数组的个数。因为 C 编译对形参 数组大小
不做检查,只将实参数组首地址传递给形参数组。 (3) 传递数组名时,实参数组的内容并没有复制到形参数组中,而是把数组的首地址传递
给被调函数。这样被调函数中的数组就指向内存中相同的数组。 任务三 计算个人所得税,长期存放税率表,并显示文件概述及基本操作 (1)
文件的概念 计算机作为一种先进的数据处理工具,它所面对的数据信息量十分庞大。仅依赖于键盘 输入和显
示输出等方式是完全不够的,通常,解决的办法就是将这些数据记录在某些介质上, 利用这些存储介质的特性,携带数据或长久地保存数据。这种
记录在外部存储介质上的数据 的集合称为“文件”。文件概述及基本操作 (2)文件的分类 C 语言中数据文件保存在外部
存储介质上有两种形式:ASCII 码文件和二进制文件。 ASCII 码文件 ASCII 码文件也称为文本文件,由一个个字符首尾相接
而成,其中每个字符占 1 字节,存放的是字符的 ASCII 码。二进制文件 二进制文件用二进制数代表数据,其中的数据是按其在内存中
的存储形式存放的。当数 据以二进制形式输出到文件中时,数据不经过任何转换。文件概述及基本操作 (3)文件的存取方式
顺序存取无论对文件进行读或写操作,总是从文件的开头开始,依先后次序存取文件中的 数据。存取完第一字节,才能存取第
二字节;存取完第 n-1 字节,才能存取第 n 字节。 随机存取也称直接存取,可以直接存取文件中指
定的数据。可以直接存取指定的第 i 个 字节(或字符),而不管第 i-1 字节是否已经存取。在 C 语言中,可以通过调用库函数去指
定 开始读写的字节号,然后直接对此位置上的数据进行读写操作。文件概述及基本操作 (4)文件指针 对于缓冲区文件系
统,一个关键的概念就是“文件指针”。文件指针就是一个描述文件状 态、文件缓冲区大小、缓冲区填充程度等信息的一个结构体变量。文件指针
结构体类型是由系 统定义的,取名为 FILE,其详细的类型声明如下: typedef struct { short level
; / 缓冲区填充程度 / unsigned flags; / 文件状态标志 / char fd;
/ 文件描述 / unsigned char hold; / 如无缓冲区不读取字符 / short b
size; / 缓冲区大小 / unsigned char buffer; / 缓冲区传输数据 /
unsigned char curp; / 指针当前位置 / unsigned istemp; / 临时文件标识 /
short token; / 有效性检查 / } FILE;文件概述及基本操作 (5)文件操作的基本步骤 1) 打开文件
用标准库函数 fopen() 打开文件,它通知编译系统三个信息:①需要打开的文件名,②使用文件的方式(读还是写等)
,③使用的文件指针。 2) 读写文件 用文件输入 / 输出函数对文件进行读写,这些输入输出函数与前面介绍的标准输
入输出函数在功能上有相似之处,但使用上又不尽相同。 3) 关闭文件 文件读写完毕,用标准函数 fclose()
将文件关闭。它的功能是把数据真正写入磁盘(否则数据可能还在缓冲区中),切断文件指针与文件名之间的联系,释放文件指针。如不关闭则多
半会丢失数据。 文件概述及基本操作 (6)文件的打开 打开文件时操作文件的第一步骤,如果不能正确打开一个指定文
件,读写文件就无从谈起。C 语言中提供了 fopen() 函数,用于打开一个文件,其格式如下:FILE fp; fp=fopen
(" 文件名 ", " 文件使用方式 ");文件概述及基本操作 文件的使用方式共有 12 种,下表 给出了文本文
件使用方式的符号和意义以及二进制文件使用方式的符号和意义。文件概述及基本操作 (7)文件的关闭 当文件的读写完成
之后,必须将它关闭,否则容易发生数据不必要的丢失。关闭文件可调用库函数 fclose() 来实现,其调用格式如下:fclose(
文件指针 );文件的读写操作(1)文件的字符读写操作 字符读写操作是文本文件的常用操作。C 语言提供了 fgetc
() 函数和 fputc() 函数来实现 对文件的字符读写功能。 1)fgetc() 读字符函数 fgetc()
函数用来从指定的文件读入一个字符,该文件必须是以读或写方式打开的。fgetc 函数具体的调用格式如下:2)fputc() 写字符
函数 fputc 函数用来将一个字符写入指定的文件中,该函数的调用格式为:ch=fgetc(fp);fputc(c
h,fp);文件的读写操作(2)文件的块读写函数 用 fgetc() 函数和 fputc() 函数可以用来读写
文件中的一个字符,如果要读写一组数据就必须编写一个循环语句段。使用 C 语言提供的 fread() 函数和 fwrite() 函数
就可以实现读取数据 块的功能,它的一般调用格式如下:fread(void buffer,int size,int count,F
ILE fp); fwrite(void buffer,int size,int count,FILE fp);文件的读写操
作(3)文字的字符串读写函数 1)fgets() 函数 fgets() 函数的功能是从指定的文件中读一个字符串到字符数组中,一般调
用格式为:2)fputs() 函数 fputs() 函数的功能是向指定的文件写入一个字符串,其调用格式为:fgets(str, n
,fp);fputs(str,fp);文件的读写操作(4)随机文件的读写 1)文件头定位函数——rewind() 函数 C 提供的
文件头定位函数 rewind() 可以将文件指针重新指定到文件头。该函数的调用格 式为:2)随机定位函数——fseek() 函数所
谓随机读写,是指读完上一个字符(字节)后,并不一定要读写其后续的字符(字节),而 可以读写文件中任意所需的字符(字节)。要想实现随
机读写,必须首先实现位置指针的随机 定位, C 语言中的 fseek() 函数可以实现这个功能。fseek() 函数的格式如下:r
ewind( 文件指针 );fseek( 文件指针,位移量,起始点 );文件的读写操作3)ftell() 函数 由于文件中的位置指针经常移动,人们往往不容易知道它的当前位置, C 语言中的 ftell 函 数可以得到当前位置,其格式如下:ftell(fp);文件的读写操作(5)出错检测 1)ferror() 函数 该函数的调用格式:2)clearerr() 函数 该函数的调用格式:ferror( 文件指针 );clearerr( 文件指针 );文件的读写操作(6)其他文件读写函数 fprintf() 函数和fscanf() 函数。与 printf() 和 scanf(),都是格式化读写函数。不同的是: fprintf() 和 fscanf() 的读写对象不是终端而是磁盘文件。它们的调用格式为:fprintf( 文件指针,格式字符串,输出列表 ); fscanf( 文件指针,格式字符串,输入列表 );任务总结 本项目通过 3 个任务,介绍 C 语言程序中的基础语法。通过结合项目的学习,了解 C 语 言中浮点常量和变量的运用,学会 printf() 函数的调用格式,掌握结构体书序的使用方式,掌握 文件的概述和操作方式,为后续的学习稳固基础。
献花(0)
+1
(本文系小磊老师原创)