第3章 最简单的C程序设计2_第1页
第3章 最简单的C程序设计2_第2页
第3章 最简单的C程序设计2_第3页
第3章 最简单的C程序设计2_第4页
第3章 最简单的C程序设计2_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章最简单的C程序设计格式化输入输出学习内容关键字:const如何使用scanf()和printf()读取和显示字符串如何使用getchar()和putchar()读取和显示单个字符使用C预处理器的#define指令和ANSI

C的const修饰符创建符号常量。前导程序#include<stdio.h>#include<math.h>intmain(){doublea,b,c,disc,x1,x2,p,q;

scanf("%lf%lf%lf",&a,&b,&c);disc=b*b–4*a*c;p=-b/(2.0*a);q=sqrt(disc)/(2.0*a);x1=p+q;x2=p-q;

printf("x1=%7.2f\nx2=%7.2f\n",x1,x2);return0;}常量和C预处理器有时需要在程序中使用常量,例如:circumference=3.14159*diameter;circumference=pi*diameter;为什么使用符号常量一个名字比一个数字获得的信息更多owed=0.015*housevalue;owed=taxrate*housevalue;修改方便常量和C预处理器如何建立符号常量声明一个变量,并设置该变量等于所需的常量floattaxrate;taxrate=0.015;C预处理器#defineTAXRATE0.015格式:首先是#define,其次是常量的符号名,接着是常量的值#defineNAMEvalueconst修饰符常量和C预处理器#defineTAXRATE0.015intmain(){...bill=TAXRATE*sum;...}输入的代码常量和C预处理器intmain(){...bill=0.015*sum;...}预处理器的工作编译器常量和C预处理器/*pizza.c--usesdefinedconstantsinapizzacontext*/#include<stdio.h>#definePI3.14159intmain(void){floatarea,circum,radius;printf("Whatistheradiusofyourpizza?\n");scanf("%f",&radius);area=PI*radius*radius;circum=2.0*PI*radius;printf("Yourbasicpizzaparametersareasfollows:\n");printf(“circumference=%1.2f,area=%1.2f\n”,circum,

area);return0;}常量和C预处理器#define语句也可以用于定义字符和字符串常量#defineBEEP‘\a’#defineTEE‘T’#defineESC‘\033’#defineOOPS“Nowyouhavedoneit!”符号名后面的所有内容都被用来替代它/*下面的定义是错误的*/#defineTOES=20digits=fingers+TOES;digits=fingers+=20;常量和C预处理器const修饰符创建符号常量的第二种方法constintMONTHS=12;//MONTHSasymbolicconstantfor12常量和C预处理器系统定义的明显常量头文件limits.h:提供有关整数类型的大小限制的详细信息例如: #defineINT_MAX+32767 #defineINT_MIN-32768头文件float.h:提供有关浮点类型的大小限制的详细信息例如:FLT_DIG:float类型支持的有效位的个数DBL_DIG:double类型支持的有效位的个数LDBL_DIG:longdouble类型支持的有效位的个数常量和C预处理器//defines.c--usesdefinedconstantsfromlimit.handfloat.#include<stdio.h>#include<limits.h>//integerlimits#include<float.h>//floating-pointlimitsintmain(void){printf("Somenumberlimitsforthissystem:\n");printf("Biggestint:%d\n",INT_MAX);printf("Onebyte=%dbitsonthissystem.\n",CHAR_BIT);printf("Largestdouble:%e\n",DBL_MAX);printf("Smallestnormalfloat:%e\n",FLT_MIN);printf("floatprecision=%ddigits\n",FLT_DIG);printf("floatepsilon=%e\n",FLT_EPSILON);

return0;}研究和利用printf()和scanf()printf()函数输出函数请求printf()打印变量的指令取决于变量的类型。转换说明:以%号开始的特定字符,例如:%d:整数%c:字符研究和利用printf()和scanf()转换说明输出%a(%A)浮点数、十六进制数字和p-记数法(C99)%c一个字符%d(%i)有符号十进制整数%e(%E)浮点数、e-记数法%f浮点数、十进制记数法%g(%G)根据数值不同自动选择%f或%e。%e格式在指数小于-4或者大于等于精度时使用%o无符号八进制整数%p指针%s字符串%u无符号十进制整数%x(%X)十六进制整数%%打印一个百分号研究和利用printf()和scanf()/*printout.c--usesconversionspecifiers*/#include<stdio.h>#definePI3.141593intmain(void){intnumber=5;floatespresso=13.5;intcost=3100;printf(“The%dCEOsdrank%fcupsofespresso.\n”,number,

espresso);printf("Thevalueofpiis%f.\n",PI);printf("Farewell!thouarttoodearformypossessing,\n");printf("%c%d\n",'$',2*cost);

return0;}研究和利用printf()和scanf()使用printf()使用格式: printf(Control-string,item1,item2,…);item1,item2…:要打印的项目,可以是变量、变量和表达式控制字符串:一个描述项目如何打印的字符串。每个要打印的项目包含一个转换说明符。实际要打印的字符。转换说明。研究和利用printf()和scanf()研究和利用printf()和scanf()使用printf()只打印一个语句,不需要任何转换说明;

printf("Farewell!thouarttoodearformypossessing,\n");只打印数据,无须加入任何说明内容printf("%c%d\n",'$',2*cost);打印%,需要用两个%号:%%pc=2*6;printf(“Only%d%%ofSally’sgribbleswereedible.\n”,pc);研究和利用printf()和scanf()printf()的转换说明修饰符:可以在%和定义转换字符之间插入修饰符对基本的转换说明加以修改。标志:5种标志(-、+、空格、#和0)。可以有零个或多个digit(s):字段宽度的最小值.digit(s):精度h:和整数转换符一起使用,表示(unsigned)short

inthh:和整数转换符一起使用,表示signed(unsigned)charl:和整数转换符一起使用,表示(unsigned)long

intll:和整数转换符一起使用,表示(unsigned)long

long

intL:和浮点说明符一起使用,表示longdoublez:和整数转换符一起使用,表示一个size_t值研究和利用printf()和scanf()printf()的转换说明修饰符标志-:项目是左对齐的。+:有符号的值若为正,则显示正号;若为负显示减号符号(空格):有符号的值若为正,则显示带前导空格;若为负显示减号符号+标志会覆盖空格标志研究和利用printf()和scanf()printf()的转换说明修饰符标志#:使用转换说明的可选形式。%o:以0开始%x或%X:以0x或0X对于所有的浮点形式,#保证了即使不跟任何数字,也打印一个小数点字符。%g或%G:防止尾随零被删除0:对于所有的数字格式,用前导零而不是用空格填充字段宽度。如果出现-标志或者指定了精度(对于整数)则忽略该标志研究和利用printf()和scanf()printf()的转换说明修饰符.digit(s)%e、%E和%f转换:将小数点的右边打印的数字的位数。%g和%G转换:有效数字的最大位数。%s转换:将要打印的字符的最大数目。整数转换:将要打印的数字的最小位数;如果有必要,要使用前导0来达到这个位数。只使用”.”表示其后跟随一个零,例如%.f与%.0f相同使用修饰符和标志示例/*width.c--fieldwidths*/#include<stdio.h>#definePAGES931intmain(void){printf("*%d*\n",PAGES);printf("*%2d*\n",PAGES);printf("*%10d*\n",PAGES);printf("*%-10d*\n",PAGES);

return0;}*931**931**

931**931

*使用修饰符和标志示例//floats.c--somefloating-pointcombinations#include<stdio.h>intmain(void){constdoubleRENT=3852.99;//const-styleconstant

printf("*%f*\n",RENT);printf("*%e*\n",RENT);printf("*%4.2f*\n",RENT);printf("*%3.1f*\n",RENT);printf("*%10.3f*\n",RENT);printf("*%10.3e*\n",RENT);printf("*%+4.2f*\n",RENT);printf("*%010.2f*\n",RENT);

return0;}*3852.990000**3.852990e+03**3852.99**3853.0**

3852.990**3.853e+03**+3852.99**0003852.99*使用修饰符和标志示例/*flags.c--illustratessomeformattingflags*/#include<stdio.h>intmain(void){printf("%x%X%#x\n",31,31,31);printf("**%d**%d**%d**\n",42,42,-42);printf("**%5d**%5.3d**%05d**%05.3d**\n",6,6,6,6);

return0;}1f1F0x1f**42**42**-42****6**006**00006**006**使用修饰符和标志示例/*strings.c--stringformatting*/#include<stdio.h>#defineBLURB"Authenticimitation!"intmain(void){printf("/%2s/\n",BLURB);printf("/%24s/\n",BLURB);printf("/%24.5s/\n",BLURB);printf("/%-24.5s/\n",BLURB);

return0;}/Authenticimitation!//Authenticimitation!//Authe//Authe/不匹配的转换/*intconv.c--somemismatchedintegerconversions*/#include<stdio.h>#definePAGES336#defineWORDS65618intmain(void){shortnum=PAGES;shortmnum=S;printf("numasshortandunsignedshort:%hd%hu\n",num,num);printf("-numasshortandunsignedshort:%hd%hu\n",mnum,mnum);printf("numasintandchar:%d%c\n",num,num);printf("WORDSasint,short,andchar:%d%hd%c\n“,WORDS,WORDS,WORDS);return0;}numasshortandunsignedshort:336336-numasshortandunsignedshort:-33665200numasintandchar:336PWORDSasint,short,andchar:6561882R不匹配的转换试图把一个大于255的值转换成字符,将发生什么事情不匹配的转换/*floatcnv.c--mismatchedfloating-pointconversions*/#include<stdio.h>intmain(void){floatn1=3.0;doublen2=3.0;longn3=2000000000;longn4=1234567890;printf("%.1e%.1e%.1e%.1e\n",n1,n2,n3,n4);printf("%ld%ld\n",n3,n4);printf("%ld%ld%ld%ld\n",n1,n2,n3,n4);

return0;}3.0e+003.0e+003.1e+461.7e+266200000000012345678900107426611201074266112不匹配的转换参数传递堆栈printf()的返回值返回值:由函数计算并返回给调用程序的值。可以赋给变量可以用于计算可以作为参数传递printf()函数的返回值:打印输出用途的附带功能,通常很少用到。正确情况:返回打印的字符的数目有输出错误:返回一个负数printf()的返回值/*prntval.c--findingprintf()'sreturnvalue*/#include<stdio.h>intmain(void){intbph2o=212;intrv;rv=printf("%dFiswater'sboilingpoint.\n",bph2o);printf("Theprintf()functionprinted%dcharacters.\n",rv);return0;}212Fiswater'sboilingpoint.Theprintf()functionprinted32characters.打印较长的字符串可以在多行放置一个语句,例如:

printf("Theprintf()functionprinted%dcharacters.\n",rv);不能在引号括起来的字符串中间断行。例如:printf("Theprintf()functionprinted%d

characters.\n",rv);字符串中使用\n符号来表示换行字符,但在字符串中不能通过回车键产生实际的换行字符。如果必须分割一个字符串,有三种方法供选择打印较长的字符串/*longstrg.c--printinglongstrings*/#include<stdio.h>intmain(void){printf("Here'sonewaytoprinta");printf("longstring.\n");printf("Here'sanotherwaytoprinta\longstring.\n");printf("Here'sthenewestwaytoprinta""longstring.\n");/*ANSIC*/return0;}打印较长的字符串三种方法使用多个printf()语句用反斜线符号(/)和回车键组合来结束第一行。下一行要从最左边开始,不能缩进采用字符串连接的方法:一个双引号后面跟着另一个用双引号引起来的字符串,而且两者之间仅有空白字符分隔。例如:printf("Hello,younglovers,whereveryouare.");printf(“Hello,young”

“lovers”

",whereveryouare.");printf("Hello,younglovers"

",whereveryouare.");使用scanf()scanf()函数:可以读取各种格式的数据把输入的字符串转换成各种形式:整数、浮点数、字符和C的字符串。printf()函数把整数、浮点数、字符和C的字符串转换为在屏幕上显示的字符scanf()函数控制字符:输入将被转换成的格式参数列表:指向变量的指针基本变量类型的值:变量名前加上一个&字符数组:不要使用&使用scanf()//input.c--whentouse&#include<stdio.h>intmain(void){intage;//variablefloatassets;//variablecharpet[30];//stringprintf("Enteryourage,assets,andfavoritepet.\n");scanf("%d%f",&age,&assets);//usethe&herescanf("%s",pet);//no&forchararrayprintf("%d$%.2f%s\n",age,assets,pet);

return0;}使用scanf()scanf()函数使用空格(换行、制表符和空格)来决定怎样把输入分成几个字段。依次把转换说明与字段相匹配,并跳过它们之间的空格。唯一的例外就是%c说明,即使下一个字符是空白字符,它也读取那个字符。使用scanf()scanf()函数所用的转换说明字符与printf()函数所用的几乎相同。主要区别:printf()函数:%f、%e、%E、%g和%G同时用于float类型和double类型scanf()函数:%f、%e、%E、%g和%G只用于float类型,用于double类型时要求使用l修饰符。使用scanf()转换说明符意义%c字符%d有符号十进制整数%e,%f,%g,%a浮点数%E,%F,%G,%A浮点数%i有符号十进制整数%o有符号八进制整数%p指针(地址)%s字符串%u无符号十进制整数%x,%X有符号十六进制整数使用scanf()scanf()的转换修饰符*:滞后赋值digit(s):最大字段宽度,在达到最大字段宽度或者遇到第一个空白字符时停止对输入项的读取hh:把整数读作signedchar或unsignedcharll:把整数读作longlong或unsignedlonglong使用scanf()scanf()的转换修饰符h、l或L:%hd和%hi:shortint%ho、%hx和%hu:unsignedshortint%ld和%li:longint%lo、%lx和%lu:unsignedlongint%le、%lf和%lg:double%Le、%Lf和%Lg:longdouble%d、%i、%o和%x:int%e、%f和%g:float从scanf()的角度看输入假定使用一个%d说明符读取一个整数开始每次读取一个输入字符,跳过空白字符(空格、制表符和换行符)直到遇到一个非空白字符。如果发现一个数字字符或者一个符号(+或-),那么将它保存之并读取下一个字符;如果接下来的字符是一个数字,保存这个数字,并读取下一个字符。持续读取和保存字符直到遇到一个非数字的字符。已读到整数的尾部。非数字字符放回输入,下一次读取时,从这个字符开始。计算读取的数字的数值,放到指定变量中从scanf()的角度看输入假定使用一个%d说明符读取一个整数如果使用了字段宽度,那么scanf()在字段结尾或者在第一个空白字符处终止。如果第一个非空白字符不是数字,比如是A,停止在那里(即使使用带有多个说明符的scanf()语句,并把它放回输入没有把任何值赋给指定的变量程序下一次读取时,从这个位置开始其他的数字说明符读取输入与使用%d情况相同。从scanf()的角度看输入%s说明符:读取一个单词非空白字符以外的所有字符都是可接受的跳过所有空白字符直到遇到第一个非空白字符保存再次遇到空白字符之前的所有字符不能通过字段宽度使得scanf()用一个%s说明符读取多于一个字的输入把字符串保存到指定的数组中时,添加终止的’\0’使得数组内容成为一个C字符串%c说明符:读取任意的一个字符如果下一个输入字符是一个空格或者换行符,将会把这个空格或者换行符赋给指定的变量;不会跳过空白字符格式字符串中的常规字符scanf("%d,%d",&n,&m);输入:88,12188,12188,121scanf("%d,%d",&n,&m);输入:88,12188,12188,121除了空格字符之外的普通字符一定要与输入字符串准确匹配。例如:格式字符串中的常规字符除了%c以外的说明符会自动跳过输入项之前的空格scanf(“%d%d”,&n,&m);scanf(“%d%d”,&n,&m);在格式字符串中%c之前有一个空格,会跳到第一个非空白字符处scanf(“%c”,&ch):读取第一个字符scanf(“

%c”,&ch):读取第一个非空字符scanf()的返回值返回成功读入的项目的数目没有读取任何项目,返回值为0检测到“文件结尾”,返回EOF(stdio.h)printf()和scanf()的*修饰符printf()函数的*修饰符使用*代替字段宽度的数字,必须使用一个参数告诉函数字段宽度应该是什么例如:%*d,%*.*fprintf()和scanf()的*修饰符/*varwid.c--usesvariable-widthoutputfield*/#include<stdio.h>intmain(void){unsignedwidth,precision;intnumber=256;doubleweight=242.5;printf("Whatfieldwidth?\n");scanf("%d",&width);printf("Thenumberis:%*d:\n",width,number);printf("Nowenterawidthandaprecision:\n");scanf("%d%d",&width,&precision);printf("Weight=%*.*f\n",width,precision,weight);printf("Done!\n");

return0;}Whatfieldwidth?6Thenumberis

:

256:Nowenterawidthandaprecision:8

3Weight=

242.500Done!printf()和scanf()的*修饰符scanf()函数的*修饰符把它放在%和说明符字母之间时,它使函数跳过相应的输入项目。例如:%*d,%*fprintf()和scanf()的*修饰符/*skip2.c--skipsoverfirsttwointegersofinput*/#include<stdio.h>intmain(void){intn;printf("Pleaseenterthreeintegers:\n");scanf("%*d%*d%d",&n);printf("Thelastintegerwas%d\n",n);

return0;}Pleaseenterthreeintegers:2004

2005

2006Thelastintegerwas2006printf的用法提示在想打印几列数据时,指定固定宽度是很有用的默认的字段宽度是数字的宽度,例如:printf("%d%d%d\n",val1,val2,val3);执行多次:122341222452322334232210001如果指定足够大的固定宽度使输出更加整齐清晰printf("%9d%9d%9d\n",val1,val2,val3);结果:

12

234

1222

4

5

23

22334

2322

10001printf的用法提示如果语句中要嵌入一个数字,那么指定和期望数字宽度同样小或更小的字段宽度通常会比较有用例如:printf("CountBepporan%.2fmilesin3hours.\n",distance);可能产生:CountBepporan10.22milesin3hours.如果改成%10.2f:CountBepporan

10.22milesin3hours.

字符数据的输入输出1.用putchar函数输出一个字符从计算机向显示器输出一个字符putchar函数的一般形式为:putchar(c)字符数据的输入输出例3.8先后输出BOY三个字符。解题思路:定义3个字符变量,分别赋以初值B、O、Y用putchar函数输出这3个字符变量的值字符数据的输入输出#include<stdio.h>intmain(){chara='B',b='O',c='Y';putchar(a);putchar(b);putchar(c);putchar('\n');return0;}向显示器输出字符B向显示器输出换行符字符数据的输入输出#include<stdio.h>intmain(){chara='B',b='O',c='Y';putchar(a);putchar(b);putchar(c);putchar('\n');return0;}改为inta=66,b=79,c=89;字符数据的输入输出putchar(’\101’)(输出字符A)putchar(’\’’)(输出单撇号字符’)字符数据的输入输出2.用getchar函数输入一个字符向计算机输入一个字符getchar函数的一般形式为:getchar()字符数据的输入输出

例3.9从键盘输入BOY三个字符,然后把它们输出到屏幕。解题思路:用3个getchar函数先后从键盘向计算机输入BOY三个字符用putchar函数输出字符数据的输入输出#include<stdio.h>intmain(){chara,b,c;a=getchar();

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论