第3章 数据的输入与输出
- 格式:doc
- 大小:45.50 KB
- 文档页数:5
《C语⾔程序设计:现代⽅法(第2版)》第3章格式化输⼊输出⽬录第3章格式化输⼊/输出在探索难以实现的问题时,问题本⾝的简单性只会使情况更糟。
scanf函数和printf函数是C语⾔编程中使⽤最频繁的两个函数,它们⽤来格式化输⼊和输出。
正如本章要展⽰的那样,虽然这两个函数功能强⼤,但要⽤好它们却不容易。
3.1节描述printf函数,3.2节则介绍scanf函数。
但是这两节的介绍都不完整,完整的细节将留到第22章中介绍。
3.1 printf函数printf函数被设计⽤来显⽰**格式串(format string)的内容,并且在该串中的指定位置插⼊可能的值。
调⽤printf函数时必须提供格式串,格式串后⾯的参数是需要在显⽰时插⼊到该串中的值:printf(格式串, 表达式1, 表达式2, ...);显⽰的值可以是常量、变量或者更加复杂的表达式。
调⽤printf函数⼀次可以打印的值的个数没有限制。
格式串包含普通字符和**转换说明(conversion specification),其中转换说明以字符%开头。
转换说明是⽤来表⽰打印过程中待填充的值的占位符。
跟随在字符%后边的信息指定了把数值从内部形式(⼆进制)转换成打印形式(字符)的⽅法,这也就是“转换说明”这⼀术语的由来。
例如,转换说明%d指定printf函数把int型值从⼆进制形式转换成⼗进制数字组成的字符串,转换说明%f对float型值也进⾏类似的转换。
格式串中的普通字符完全如在字符串中出现的那样显⽰出来,⽽转换说明则要⽤待显⽰的值来替换。
思考下⾯的例⼦:#include <stdio.h>int main() {int i, j;float x, y;i = 10;j = 20;x = 43.2892f;y = 5527.0f;printf("i = %d, j = %d, x = %f, y = %f\n", i, j, x, y);return 0;}这个printf函数调⽤会产⽣如下输出:i = 10, j = 20, x = 43.289200, y = 5527.000000格式串中的普通字符被简单复制给输出⾏,⽽变量i、j、x和y的值则依次替换了4个转换说明。
第3章数据的输入与输出本章只介绍MATLAB最常用的输入与输出命令。
3.1 用INPUT函数输入数据数据可以按程序或函数限定的格式由用户用input输入。
此外,input还可以在MATLAB命令窗口中显示以提示用户输入什么。
然而,数据的具体形式依赖于数据是标量、向量还是矩阵,以及它们是数值还是字符串。
举例说明一下这几种情况。
3.1.1 标量的输入输入一个数值时,可以采用:InputData=input(‘Enter the temperature in degrees C:’);在MATLAB命令窗口中显示:Enter the temperature in degrees C: 121.7其中数值121.7由用户输入。
表达式末尾的分号可禁止系统对于输入数据的回显。
在同一表达式中可以执行用户输入数据的计算。
例如:InputData= input(‘Enter the starting angle in degrees:’)*pi/180;结果显示:Enter the starting angle in degrees:45其中数值45由用户输入。
然而,InputData的数值为 0.7854(45π/180)。
又如,考虑温度从摄氏度向华氏度的变换,输入:InputData=1.88*input(‘Enter the temperature in degrees C:’)+32;结果显示:Enter the temperature in degrees C:100其中数值100由用户输入。
而InputData的数值为212。
(220)如希望将提示信息显示在几行中,则可以在单引号内的适当位置上加入定义符“\ n”,即:InputData= input(‘Enter the starting angle\ n in degrees:’)*pi/180;结果显示:Enter the starting anglein degrees:3.1.2 字符串的输入输入一个字符串时,可以采用:InputData=input(‘Enter file name,including its extension:’,’s’)*pi/180;结果显示:Enter file name,including its extension:DataSet3.txt其中字符串DataSet3.txt由用户输入。
注意这里不需要加单引号,这是由input 函数中第二项参数’s’决定的。
3.1.3 向量的输入输入由数值构成的向量时,可以采用:InputData=input(‘Enter the temperature in degrees C:’);在MATLAB命令窗口显示:Enter the temperature in degrees C:[120,141,169,201]其中向量[120,141,169,201]由用户输入。
这里方括号是必须的。
若要输入列向量,则用户应输入[120,141,169,201]'。
3.1.4 矩阵的输入输入由数值构成的矩阵时,可以采用:InputData=input(‘Enter the temperature in degrees C \n at levels 1 and 2:’);在MATLAB命令窗口显示:Enter the temperature in degrees Cat levels 1 and 2:[67 35 91;44 51 103]其中数组[67 35 91;44 51 103]由用户输入。
3.2 字符串(文字)和注释的输出在MATLAB中允许矩阵的创建、存贮和操作,这些矩阵可以是字母、数字和一些特殊字符任意组合而成的字符串。
字符串的定义是把字符串放在单引号内,除此以外,其他与向量和矩阵的定义类似。
下面介绍几个最常用的几个函数。
1、num2str----将数值转换为字符串。
2、disp----在MATLAB命令窗口显示字符串。
例如:num=12.567;z=num2str(num);disp(['产品重量 =','z','kg'])或者,更为紧凑的形式是:num=12.567;disp(['产品重量 =',num2str(num),'kg'])执行后,显示在MATLAB命令窗口中的结果为:产品重量 =12.567 kg若num是重量的向量,那么num=[12.567,3.458,9.111];disp(['产品重量 =',num2str(num),'kg'])显示:产品重量 =12.567 3.458 9.111 kg然而,可以使用下面的程序建立与每个mun值一致的注释:num=[12.567,3.458,9.111];disp([repmat('产品重量 ='n,1),num2str(num'),repmat('kg',n,1)]) 执行后显示:产品重量 =12.567 kg产品重量 =3.458 kg产品重量 =9.111 kg若不需要显示num的注释,则num=[12.567,3.458,9.111];disp(num)在MATLAB命令窗口中显示:12.56703.45809.1110MATLAB允许用户指定数值转换为字符串时的位数:(不懂)num2str(a,N)其中a是要转换的数值,N是数值的位数。
若指定的位数小于小数点左边的位数,则MATLAB将数值转换为指数描述形式,且有效数字等于N。
考虑下面的例子,a=100 =3141.592653589,则:num2str(a,1) →3e+003 num2str(a,3) →3.14e+003num2str(a,4) →3142 num2str(a,5) →3141.5num2str(a,8) →3141.59273、fprintf ----可以在MATLAB窗口中显示有格式的数据,他相对于函数disp的优势在于他能够控制数值得显示格式。
函数fprintf的语法结构为: fprintf(1,'% ….',variables)其中第一个参数为‘1’,表示在MATLAB命令窗口输出,而引号内的参数是变量格式的附加说明。
格式说明的顺序对应着变量的顺序。
符号%在每个具体格式说明之前。
通过下面的向量可说明fprintf的几种不同的用法。
num=[12,-14,3.458,0.11167];fprintf(1,'%5.3f',num)结果为:12.000 -14.000 3.458 0.112 >>注意num(1)和num(2)的值加了3个0,而num(4)在小数点后则近似取了3位数。
另外,>>表明数据已经在一行中显示出来,可以执行其他的MATLAB表达式。
若想得到下一行,按Enter键即可。
如果要把这4个数值作为一列来显示,可以采用定义符“\ n”,如下所示:num=[12,-14,3.458,0.11167];fprintf(1,'%5.3f \ n',num)结果为:(为什么得到的是一行而不是一列?)12.000-14.0003.4580.112若想得到与给定精度相同的4个数值,则:(%和f之间的数字是什么意思?) num=[12,-14,3.458,0.11167] ;fprintf(1,'%2.0f %2.0f %5.3f %5.5f',num)其中每个f和%之间都有两个空格,这样数值就被两个空格分开了。
执行后产生: 12 -14 3.458 0.11167 >>可以用如下方法对每一个数值进行注释:num=[12,-14,3.458,0.11167];fprintf(1,'weight = %2.0f kg pressure = %2.0f Pa time = %5.3f s … length = %5.3f m \n',num)结果为:weight = 12 kg pressure = -14 Pa time = 3.458 m length = 0.11167 m 如想按列显示数值,则程序为:num=[12,-14,3.458,0.11167];fprintf(1,'weight = %2.0f kg \ npressure = %2.0f Pa \ ntime = %5.3f s… \ nlength = %5.3f m \n',num)结果为:weight = 12 kgpressure = -14 Patime = 3.458 slength = 0.11167 m若让每个数值按相同的格式显示,则可以简化格式说明并产生注释输出,程序为:num=[12,-14,3.458,0.11167];nn=1:length(num);fprintf(1,'x(%1.0f) = %7.5f \ n',[nn;num])结果为:x(1) = 12.00000x(2) = -14.00000x(3) = 3.45800x(4) = 0.111673.3 数据文件的输入与输出如前所述,数据输入的一种方法是通过程序用input函数完成。
第二种方法是在程序中定义数据。
其他输入数据的方法是将数据存放在ASCII文本文件之中,然后调用load函数。
load函数按行读取数据,每行由回车符分隔且每个数值之间用空格或逗号分隔。
下面举例说明load函数的两种使用方法。
假设数据按下面的形式存放在DataSection33.txt文件中:(怎么保存?和调用)11 12 1321 22 2331 32 3341 42 43laod函数的用途在于将不带扩展名(后缀“.txt”)的主文件名变为变量名,将文件中的数据变为向量或矩阵元素。
因此,程序中名为DataSection33的变量是一个(4x3)阶的数值矩阵,他在程序中的使用就如同一个已放置在等号左边的名为DataSection33的变量一样。
函数语句可为:load DataSection33.txt 或 load ‘DataSection33.txt’或 load(‘DataSection33.txt’)如果希望对矩阵中的每一个元素取平方,可输入:load ‘DataSection33.txt’y=DataSection33.^2结果显示: 121 144 169441 484 529961 1024 10891981 1764 1849如果要把程序中的数值保存到文件之中,可使用:save假如要把文件DataSection33.txt 中每个值得平方存成ASCII 文本文件,程序为:load ‘DataSection33.txt ’y=DataSection33.^2save ‘SaveDataSection33.txt ’y-ascii结果生成一个包含下列内容的文本文件:1.2100000e+002 1.4400000e+002 1.6900000e+0024.4100000e+002 4.8400000e+0025.2900000e+0029.6100000e+002 1.0240000e+003 1.0890000e+0031.6810000e+003 1.7680000e+003 1.8490000e+003当给定文件名时,MATLAB 把文件存放在默认的目录中。